mirror of https://github.com/icsharpcode/ILSpy.git
105 changed files with 40012 additions and 8024 deletions
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
public enum Enum0 |
||||
{ |
||||
// error: enumerator has no value
|
||||
const_0, |
||||
// error: enumerator has no value
|
||||
const_1, |
||||
// error: enumerator has no value
|
||||
const_2, |
||||
// error: enumerator has no value
|
||||
const_3 |
||||
} |
||||
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
// 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 extern System |
||||
{ |
||||
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly extern System.Core |
||||
{ |
||||
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly Issue1323 |
||||
{ |
||||
.ver 1:0:0:0 |
||||
} |
||||
.module Issue1323.dll |
||||
// MVID: {B973FCD6-A9C4-48A9-8291-26DDC248E208} |
||||
.imagebase 0x00400000 |
||||
.file alignment 0x00000200 |
||||
.stackreserve 0x00100000 |
||||
.subsystem 0x0003 // WINDOWS_CUI |
||||
.corflags 0x00020003 // ILONLY 32BITPREFERRED |
||||
// Image base: 0x000001C4B6C90000 |
||||
|
||||
.class public auto ansi sealed Enum0 |
||||
extends [mscorlib]System.Enum |
||||
{ |
||||
// Fields |
||||
.field public specialname rtspecialname int32 value__ |
||||
.field public static literal valuetype Enum0 const_0 |
||||
.field public static literal valuetype Enum0 const_1 |
||||
.field public static literal valuetype Enum0 const_2 |
||||
.field public static literal valuetype Enum0 const_3 |
||||
|
||||
} // end of class Enum0 |
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,270 @@
@@ -0,0 +1,270 @@
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
||||
{ |
||||
public abstract class ReduceNesting |
||||
{ |
||||
public abstract bool B(int i); |
||||
public abstract int I(int i); |
||||
|
||||
public void IfIf() |
||||
{ |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
return; |
||||
} |
||||
|
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
} |
||||
|
||||
Console.WriteLine("end"); |
||||
} |
||||
|
||||
public void IfSwitch() |
||||
{ |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
return; |
||||
} |
||||
|
||||
Console.WriteLine("switch"); |
||||
switch (I(0)) { |
||||
case 0: |
||||
Console.WriteLine("case 0"); |
||||
break; |
||||
case 1: |
||||
Console.WriteLine("case 1"); |
||||
break; |
||||
default: |
||||
Console.WriteLine("end"); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
public void IfSwitchSwitch() |
||||
{ |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
return; |
||||
} |
||||
|
||||
Console.WriteLine("switch 0"); |
||||
switch (I(1)) { |
||||
case 0: |
||||
Console.WriteLine("case 0"); |
||||
return; |
||||
case 1: |
||||
Console.WriteLine("case 1"); |
||||
return; |
||||
} |
||||
|
||||
Console.WriteLine("switch 1"); |
||||
switch (I(1)) { |
||||
case 0: |
||||
Console.WriteLine("case 0"); |
||||
break; |
||||
case 1: |
||||
Console.WriteLine("case 1"); |
||||
break; |
||||
default: |
||||
Console.WriteLine("end"); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
public void IfLoop() |
||||
{ |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
return; |
||||
} |
||||
|
||||
for (int i = 0; i < 10; i++) { |
||||
Console.WriteLine(i); |
||||
} |
||||
|
||||
Console.WriteLine("end"); |
||||
} |
||||
|
||||
public void LoopContinue() |
||||
{ |
||||
for (int i = 0; i < 10; i++) { |
||||
Console.WriteLine(i); |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
continue; |
||||
} |
||||
|
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
} |
||||
Console.WriteLine("loop-tail"); |
||||
} |
||||
} |
||||
|
||||
public void LoopBreak() |
||||
{ |
||||
for (int i = 0; i < 10; i++) { |
||||
Console.WriteLine(i); |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
continue; |
||||
} |
||||
|
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
break; |
||||
} |
||||
|
||||
if (B(2)) { |
||||
Console.WriteLine(2); |
||||
} |
||||
|
||||
Console.WriteLine("break"); |
||||
break; |
||||
} |
||||
Console.WriteLine("end"); |
||||
} |
||||
|
||||
public void LoopBreakElseIf() |
||||
{ |
||||
for (int i = 0; i < 10; i++) { |
||||
Console.WriteLine(i); |
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
continue; |
||||
} |
||||
|
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
} else if (B(2)) { |
||||
Console.WriteLine(2); |
||||
} |
||||
break; |
||||
} |
||||
Console.WriteLine("end"); |
||||
} |
||||
|
||||
public void SwitchIf() |
||||
{ |
||||
switch (I(0)) { |
||||
case 0: |
||||
Console.WriteLine("case 0"); |
||||
return; |
||||
case 1: |
||||
Console.WriteLine("case 1"); |
||||
return; |
||||
} |
||||
|
||||
if (B(0)) { |
||||
Console.WriteLine(0); |
||||
} |
||||
Console.WriteLine("end"); |
||||
} |
||||
|
||||
public void NestedSwitchIf() |
||||
{ |
||||
if (B(0)) { |
||||
switch (I(0)) { |
||||
case 0: |
||||
Console.WriteLine("case 0"); |
||||
return; |
||||
case 1: |
||||
Console.WriteLine("case 1"); |
||||
return; |
||||
} |
||||
|
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
} |
||||
} else { |
||||
Console.WriteLine("else"); |
||||
} |
||||
} |
||||
|
||||
// nesting should not be reduced as maximum nesting level is 1
|
||||
public void EarlyExit1() |
||||
{ |
||||
if (!B(0)) { |
||||
for (int i = 0; i < 10; i++) { |
||||
Console.WriteLine(i); |
||||
} |
||||
Console.WriteLine("end"); |
||||
} |
||||
} |
||||
|
||||
// nesting should not be reduced as maximum nesting level is 2
|
||||
public void EarlyExit2() |
||||
{ |
||||
if (B(0)) { |
||||
return; |
||||
} |
||||
|
||||
for (int i = 0; i < 10; i++) { |
||||
Console.WriteLine(i); |
||||
if (i % 2 == 0) { |
||||
Console.WriteLine("even"); |
||||
} |
||||
} |
||||
|
||||
Console.WriteLine("end"); |
||||
} |
||||
|
||||
// nesting should not be reduced as maximum nesting level is 1 and the else block has no more instructions than any other block
|
||||
public void BalancedIf() |
||||
{ |
||||
if (B(0)) { |
||||
Console.WriteLine("true"); |
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
} |
||||
} else { |
||||
if (B(2)) { |
||||
Console.WriteLine(2); |
||||
} |
||||
Console.WriteLine("false"); |
||||
} |
||||
} |
||||
|
||||
public string ComplexCase1(string s) |
||||
{ |
||||
if (B(0)) { |
||||
return s; |
||||
} |
||||
|
||||
for (int i = 0; i < s.Length; i++) { |
||||
if (B(1)) { |
||||
Console.WriteLine(1); |
||||
} else if (B(2)) { |
||||
switch (i) { |
||||
case 1: |
||||
if (B(3)) { |
||||
Console.WriteLine(3); |
||||
break; |
||||
} |
||||
|
||||
Console.WriteLine("case1"); |
||||
if (B(4)) { |
||||
Console.WriteLine(4); |
||||
} |
||||
break; |
||||
case 2: |
||||
case 3: |
||||
Console.WriteLine("case23"); |
||||
break; |
||||
} |
||||
Console.WriteLine(2); |
||||
} else if (B(5)) { |
||||
Console.WriteLine(5); |
||||
} else { |
||||
if (B(6)) { |
||||
Console.WriteLine(6); |
||||
} |
||||
Console.WriteLine("else"); |
||||
} |
||||
} |
||||
return s; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,949 @@
@@ -0,0 +1,949 @@
|
||||
|
||||
|
||||
|
||||
|
||||
// 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 ReduceNesting |
||||
{ |
||||
.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. |
||||
.permissionset reqmin |
||||
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} |
||||
.hash algorithm 0x00008004 |
||||
.ver 0:0:0:0 |
||||
} |
||||
.module ReduceNesting.dll |
||||
.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 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class public abstract auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.method public hidebysig newslot abstract virtual |
||||
instance bool B(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::B |
||||
|
||||
.method public hidebysig newslot abstract virtual |
||||
instance int32 I(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::I |
||||
|
||||
.method public hidebysig instance void |
||||
IfIf() cil managed |
||||
{ |
||||
// Code size 60 (0x3c) |
||||
.maxstack 2 |
||||
.locals init (bool V_0) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.0 |
||||
IL_000c: ldloc.0 |
||||
IL_000d: brtrue.s IL_0019 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0016: nop |
||||
IL_0017: br.s IL_003b |
||||
|
||||
IL_0019: ldarg.0 |
||||
IL_001a: ldc.i4.1 |
||||
IL_001b: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0020: ldc.i4.0 |
||||
IL_0021: ceq |
||||
IL_0023: stloc.0 |
||||
IL_0024: ldloc.0 |
||||
IL_0025: brtrue.s IL_0030 |
||||
|
||||
IL_0027: nop |
||||
IL_0028: ldc.i4.1 |
||||
IL_0029: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002e: nop |
||||
IL_002f: nop |
||||
IL_0030: ldstr "end" |
||||
IL_0035: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003a: nop |
||||
IL_003b: ret |
||||
} // end of method ReduceNesting::IfIf |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitch() cil managed |
||||
{ |
||||
// Code size 100 (0x64) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.0 |
||||
IL_000c: ldloc.0 |
||||
IL_000d: brtrue.s IL_0019 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0016: nop |
||||
IL_0017: br.s IL_0063 |
||||
|
||||
IL_0019: ldstr "switch" |
||||
IL_001e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0023: nop |
||||
IL_0024: ldarg.0 |
||||
IL_0025: ldc.i4.0 |
||||
IL_0026: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_002b: stloc.1 |
||||
IL_002c: ldloc.1 |
||||
IL_002d: switch ( |
||||
IL_003c, |
||||
IL_0049) |
||||
IL_003a: br.s IL_0056 |
||||
|
||||
IL_003c: ldstr "case 0" |
||||
IL_0041: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0046: nop |
||||
IL_0047: br.s IL_0063 |
||||
|
||||
IL_0049: ldstr "case 1" |
||||
IL_004e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0053: nop |
||||
IL_0054: br.s IL_0063 |
||||
|
||||
IL_0056: ldstr "end" |
||||
IL_005b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0060: nop |
||||
IL_0061: br.s IL_0063 |
||||
|
||||
IL_0063: ret |
||||
} // end of method ReduceNesting::IfSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitchSwitch() cil managed |
||||
{ |
||||
// Code size 164 (0xa4) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.0 |
||||
IL_000c: ldloc.0 |
||||
IL_000d: brtrue.s IL_001c |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0016: nop |
||||
IL_0017: br IL_00a3 |
||||
|
||||
IL_001c: ldstr "switch 0" |
||||
IL_0021: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0026: nop |
||||
IL_0027: ldarg.0 |
||||
IL_0028: ldc.i4.1 |
||||
IL_0029: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_002e: stloc.1 |
||||
IL_002f: ldloc.1 |
||||
IL_0030: switch ( |
||||
IL_003f, |
||||
IL_004c) |
||||
IL_003d: br.s IL_0059 |
||||
|
||||
IL_003f: ldstr "case 0" |
||||
IL_0044: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0049: nop |
||||
IL_004a: br.s IL_00a3 |
||||
|
||||
IL_004c: ldstr "case 1" |
||||
IL_0051: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0056: nop |
||||
IL_0057: br.s IL_00a3 |
||||
|
||||
IL_0059: ldstr "switch 1" |
||||
IL_005e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0063: nop |
||||
IL_0064: ldarg.0 |
||||
IL_0065: ldc.i4.1 |
||||
IL_0066: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_006b: stloc.1 |
||||
IL_006c: ldloc.1 |
||||
IL_006d: switch ( |
||||
IL_007c, |
||||
IL_0089) |
||||
IL_007a: br.s IL_0096 |
||||
|
||||
IL_007c: ldstr "case 0" |
||||
IL_0081: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0086: nop |
||||
IL_0087: br.s IL_00a3 |
||||
|
||||
IL_0089: ldstr "case 1" |
||||
IL_008e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0093: nop |
||||
IL_0094: br.s IL_00a3 |
||||
|
||||
IL_0096: ldstr "end" |
||||
IL_009b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00a0: nop |
||||
IL_00a1: br.s IL_00a3 |
||||
|
||||
IL_00a3: ret |
||||
} // end of method ReduceNesting::IfSwitchSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfLoop() cil managed |
||||
{ |
||||
// Code size 63 (0x3f) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.1 |
||||
IL_000c: ldloc.1 |
||||
IL_000d: brtrue.s IL_0019 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0016: nop |
||||
IL_0017: br.s IL_003e |
||||
|
||||
IL_0019: ldc.i4.0 |
||||
IL_001a: stloc.0 |
||||
IL_001b: br.s IL_002a |
||||
|
||||
IL_001d: nop |
||||
IL_001e: ldloc.0 |
||||
IL_001f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0024: nop |
||||
IL_0025: nop |
||||
IL_0026: ldloc.0 |
||||
IL_0027: ldc.i4.1 |
||||
IL_0028: add |
||||
IL_0029: stloc.0 |
||||
IL_002a: ldloc.0 |
||||
IL_002b: ldc.i4.s 10 |
||||
IL_002d: clt |
||||
IL_002f: stloc.1 |
||||
IL_0030: ldloc.1 |
||||
IL_0031: brtrue.s IL_001d |
||||
|
||||
IL_0033: ldstr "end" |
||||
IL_0038: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003d: nop |
||||
IL_003e: ret |
||||
} // end of method ReduceNesting::IfLoop |
||||
|
||||
.method public hidebysig instance void |
||||
LoopContinue() cil managed |
||||
{ |
||||
// Code size 86 (0x56) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: stloc.0 |
||||
IL_0003: br.s IL_004c |
||||
|
||||
IL_0005: nop |
||||
IL_0006: ldloc.0 |
||||
IL_0007: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0014: ldc.i4.0 |
||||
IL_0015: ceq |
||||
IL_0017: stloc.1 |
||||
IL_0018: ldloc.1 |
||||
IL_0019: brtrue.s IL_0025 |
||||
|
||||
IL_001b: nop |
||||
IL_001c: ldc.i4.0 |
||||
IL_001d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0022: nop |
||||
IL_0023: br.s IL_0048 |
||||
|
||||
IL_0025: ldarg.0 |
||||
IL_0026: ldc.i4.1 |
||||
IL_0027: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002c: ldc.i4.0 |
||||
IL_002d: ceq |
||||
IL_002f: stloc.1 |
||||
IL_0030: ldloc.1 |
||||
IL_0031: brtrue.s IL_003c |
||||
|
||||
IL_0033: nop |
||||
IL_0034: ldc.i4.1 |
||||
IL_0035: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003a: nop |
||||
IL_003b: nop |
||||
IL_003c: ldstr "loop-tail" |
||||
IL_0041: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0046: nop |
||||
IL_0047: nop |
||||
IL_0048: ldloc.0 |
||||
IL_0049: ldc.i4.1 |
||||
IL_004a: add |
||||
IL_004b: stloc.0 |
||||
IL_004c: ldloc.0 |
||||
IL_004d: ldc.i4.s 10 |
||||
IL_004f: clt |
||||
IL_0051: stloc.1 |
||||
IL_0052: ldloc.1 |
||||
IL_0053: brtrue.s IL_0005 |
||||
|
||||
IL_0055: ret |
||||
} // end of method ReduceNesting::LoopContinue |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreak() cil managed |
||||
{ |
||||
// Code size 122 (0x7a) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: stloc.0 |
||||
IL_0003: br.s IL_0065 |
||||
|
||||
IL_0005: nop |
||||
IL_0006: ldloc.0 |
||||
IL_0007: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0014: ldc.i4.0 |
||||
IL_0015: ceq |
||||
IL_0017: stloc.1 |
||||
IL_0018: ldloc.1 |
||||
IL_0019: brtrue.s IL_0025 |
||||
|
||||
IL_001b: nop |
||||
IL_001c: ldc.i4.0 |
||||
IL_001d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0022: nop |
||||
IL_0023: br.s IL_0061 |
||||
|
||||
IL_0025: ldarg.0 |
||||
IL_0026: ldc.i4.1 |
||||
IL_0027: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002c: ldc.i4.0 |
||||
IL_002d: ceq |
||||
IL_002f: stloc.1 |
||||
IL_0030: ldloc.1 |
||||
IL_0031: brtrue.s IL_003d |
||||
|
||||
IL_0033: nop |
||||
IL_0034: ldc.i4.1 |
||||
IL_0035: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003a: nop |
||||
IL_003b: br.s IL_006e |
||||
|
||||
IL_003d: ldarg.0 |
||||
IL_003e: ldc.i4.2 |
||||
IL_003f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0044: ldc.i4.0 |
||||
IL_0045: ceq |
||||
IL_0047: stloc.1 |
||||
IL_0048: ldloc.1 |
||||
IL_0049: brtrue.s IL_0054 |
||||
|
||||
IL_004b: nop |
||||
IL_004c: ldc.i4.2 |
||||
IL_004d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0052: nop |
||||
IL_0053: nop |
||||
IL_0054: ldstr "break" |
||||
IL_0059: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_005e: nop |
||||
IL_005f: br.s IL_006e |
||||
|
||||
IL_0061: ldloc.0 |
||||
IL_0062: ldc.i4.1 |
||||
IL_0063: add |
||||
IL_0064: stloc.0 |
||||
IL_0065: ldloc.0 |
||||
IL_0066: ldc.i4.s 10 |
||||
IL_0068: clt |
||||
IL_006a: stloc.1 |
||||
IL_006b: ldloc.1 |
||||
IL_006c: brtrue.s IL_0005 |
||||
|
||||
IL_006e: ldstr "end" |
||||
IL_0073: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0078: nop |
||||
IL_0079: ret |
||||
} // end of method ReduceNesting::LoopBreak |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreakElseIf() cil managed |
||||
{ |
||||
// Code size 112 (0x70) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: stloc.0 |
||||
IL_0003: br.s IL_005b |
||||
|
||||
IL_0005: nop |
||||
IL_0006: ldloc.0 |
||||
IL_0007: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0014: ldc.i4.0 |
||||
IL_0015: ceq |
||||
IL_0017: stloc.1 |
||||
IL_0018: ldloc.1 |
||||
IL_0019: brtrue.s IL_0025 |
||||
|
||||
IL_001b: nop |
||||
IL_001c: ldc.i4.0 |
||||
IL_001d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0022: nop |
||||
IL_0023: br.s IL_0057 |
||||
|
||||
IL_0025: ldarg.0 |
||||
IL_0026: ldc.i4.1 |
||||
IL_0027: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002c: ldc.i4.0 |
||||
IL_002d: ceq |
||||
IL_002f: stloc.1 |
||||
IL_0030: ldloc.1 |
||||
IL_0031: brtrue.s IL_003e |
||||
|
||||
IL_0033: nop |
||||
IL_0034: ldc.i4.1 |
||||
IL_0035: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003a: nop |
||||
IL_003b: nop |
||||
IL_003c: br.s IL_0055 |
||||
|
||||
IL_003e: ldarg.0 |
||||
IL_003f: ldc.i4.2 |
||||
IL_0040: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0045: ldc.i4.0 |
||||
IL_0046: ceq |
||||
IL_0048: stloc.1 |
||||
IL_0049: ldloc.1 |
||||
IL_004a: brtrue.s IL_0055 |
||||
|
||||
IL_004c: nop |
||||
IL_004d: ldc.i4.2 |
||||
IL_004e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0053: nop |
||||
IL_0054: nop |
||||
IL_0055: br.s IL_0064 |
||||
|
||||
IL_0057: ldloc.0 |
||||
IL_0058: ldc.i4.1 |
||||
IL_0059: add |
||||
IL_005a: stloc.0 |
||||
IL_005b: ldloc.0 |
||||
IL_005c: ldc.i4.s 10 |
||||
IL_005e: clt |
||||
IL_0060: stloc.1 |
||||
IL_0061: ldloc.1 |
||||
IL_0062: brtrue.s IL_0005 |
||||
|
||||
IL_0064: ldstr "end" |
||||
IL_0069: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_006e: nop |
||||
IL_006f: ret |
||||
} // end of method ReduceNesting::LoopBreakElseIf |
||||
|
||||
.method public hidebysig instance void |
||||
SwitchIf() cil managed |
||||
{ |
||||
// Code size 86 (0x56) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: switch ( |
||||
IL_0019, |
||||
IL_0026) |
||||
IL_0017: br.s IL_0033 |
||||
|
||||
IL_0019: ldstr "case 0" |
||||
IL_001e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0023: nop |
||||
IL_0024: br.s IL_0055 |
||||
|
||||
IL_0026: ldstr "case 1" |
||||
IL_002b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0030: nop |
||||
IL_0031: br.s IL_0055 |
||||
|
||||
IL_0033: ldarg.0 |
||||
IL_0034: ldc.i4.0 |
||||
IL_0035: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003a: ldc.i4.0 |
||||
IL_003b: ceq |
||||
IL_003d: stloc.1 |
||||
IL_003e: ldloc.1 |
||||
IL_003f: brtrue.s IL_004a |
||||
|
||||
IL_0041: nop |
||||
IL_0042: ldc.i4.0 |
||||
IL_0043: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0048: nop |
||||
IL_0049: nop |
||||
IL_004a: ldstr "end" |
||||
IL_004f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0054: nop |
||||
IL_0055: ret |
||||
} // end of method ReduceNesting::SwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
NestedSwitchIf() cil managed |
||||
{ |
||||
// Code size 106 (0x6a) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.0 |
||||
IL_000c: ldloc.0 |
||||
IL_000d: brtrue.s IL_005c |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldarg.0 |
||||
IL_0011: ldc.i4.0 |
||||
IL_0012: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0017: stloc.1 |
||||
IL_0018: ldloc.1 |
||||
IL_0019: switch ( |
||||
IL_0028, |
||||
IL_0035) |
||||
IL_0026: br.s IL_0042 |
||||
|
||||
IL_0028: ldstr "case 0" |
||||
IL_002d: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0032: nop |
||||
IL_0033: br.s IL_0069 |
||||
|
||||
IL_0035: ldstr "case 1" |
||||
IL_003a: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003f: nop |
||||
IL_0040: br.s IL_0069 |
||||
|
||||
IL_0042: ldarg.0 |
||||
IL_0043: ldc.i4.1 |
||||
IL_0044: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0049: ldc.i4.0 |
||||
IL_004a: ceq |
||||
IL_004c: stloc.0 |
||||
IL_004d: ldloc.0 |
||||
IL_004e: brtrue.s IL_0059 |
||||
|
||||
IL_0050: nop |
||||
IL_0051: ldc.i4.1 |
||||
IL_0052: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0057: nop |
||||
IL_0058: nop |
||||
IL_0059: nop |
||||
IL_005a: br.s IL_0069 |
||||
|
||||
IL_005c: nop |
||||
IL_005d: ldstr "else" |
||||
IL_0062: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0067: nop |
||||
IL_0068: nop |
||||
IL_0069: ret |
||||
} // end of method ReduceNesting::NestedSwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit1() cil managed |
||||
{ |
||||
// Code size 52 (0x34) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.1 |
||||
IL_0009: ldloc.1 |
||||
IL_000a: brtrue.s IL_0033 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: stloc.0 |
||||
IL_000f: br.s IL_001e |
||||
|
||||
IL_0011: nop |
||||
IL_0012: ldloc.0 |
||||
IL_0013: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0018: nop |
||||
IL_0019: nop |
||||
IL_001a: ldloc.0 |
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: add |
||||
IL_001d: stloc.0 |
||||
IL_001e: ldloc.0 |
||||
IL_001f: ldc.i4.s 10 |
||||
IL_0021: clt |
||||
IL_0023: stloc.1 |
||||
IL_0024: ldloc.1 |
||||
IL_0025: brtrue.s IL_0011 |
||||
|
||||
IL_0027: ldstr "end" |
||||
IL_002c: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0031: nop |
||||
IL_0032: nop |
||||
IL_0033: ret |
||||
} // end of method ReduceNesting::EarlyExit1 |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit2() cil managed |
||||
{ |
||||
// Code size 82 (0x52) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.1 |
||||
IL_000c: ldloc.1 |
||||
IL_000d: brtrue.s IL_0012 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: br.s IL_0051 |
||||
|
||||
IL_0012: ldc.i4.0 |
||||
IL_0013: stloc.0 |
||||
IL_0014: br.s IL_003d |
||||
|
||||
IL_0016: nop |
||||
IL_0017: ldloc.0 |
||||
IL_0018: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001d: nop |
||||
IL_001e: ldloc.0 |
||||
IL_001f: ldc.i4.2 |
||||
IL_0020: rem |
||||
IL_0021: ldc.i4.0 |
||||
IL_0022: ceq |
||||
IL_0024: ldc.i4.0 |
||||
IL_0025: ceq |
||||
IL_0027: stloc.1 |
||||
IL_0028: ldloc.1 |
||||
IL_0029: brtrue.s IL_0038 |
||||
|
||||
IL_002b: nop |
||||
IL_002c: ldstr "even" |
||||
IL_0031: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0036: nop |
||||
IL_0037: nop |
||||
IL_0038: nop |
||||
IL_0039: ldloc.0 |
||||
IL_003a: ldc.i4.1 |
||||
IL_003b: add |
||||
IL_003c: stloc.0 |
||||
IL_003d: ldloc.0 |
||||
IL_003e: ldc.i4.s 10 |
||||
IL_0040: clt |
||||
IL_0042: stloc.1 |
||||
IL_0043: ldloc.1 |
||||
IL_0044: brtrue.s IL_0016 |
||||
|
||||
IL_0046: ldstr "end" |
||||
IL_004b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0050: nop |
||||
IL_0051: ret |
||||
} // end of method ReduceNesting::EarlyExit2 |
||||
|
||||
.method public hidebysig instance void |
||||
BalancedIf() cil managed |
||||
{ |
||||
// Code size 90 (0x5a) |
||||
.maxstack 2 |
||||
.locals init (bool V_0) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.0 |
||||
IL_000c: ldloc.0 |
||||
IL_000d: brtrue.s IL_0035 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldstr "true" |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001a: nop |
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: ldc.i4.0 |
||||
IL_0023: ceq |
||||
IL_0025: stloc.0 |
||||
IL_0026: ldloc.0 |
||||
IL_0027: brtrue.s IL_0032 |
||||
|
||||
IL_0029: nop |
||||
IL_002a: ldc.i4.1 |
||||
IL_002b: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0030: nop |
||||
IL_0031: nop |
||||
IL_0032: nop |
||||
IL_0033: br.s IL_0059 |
||||
|
||||
IL_0035: nop |
||||
IL_0036: ldarg.0 |
||||
IL_0037: ldc.i4.2 |
||||
IL_0038: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003d: ldc.i4.0 |
||||
IL_003e: ceq |
||||
IL_0040: stloc.0 |
||||
IL_0041: ldloc.0 |
||||
IL_0042: brtrue.s IL_004d |
||||
|
||||
IL_0044: nop |
||||
IL_0045: ldc.i4.2 |
||||
IL_0046: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_004b: nop |
||||
IL_004c: nop |
||||
IL_004d: ldstr "false" |
||||
IL_0052: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0057: nop |
||||
IL_0058: nop |
||||
IL_0059: ret |
||||
} // end of method ReduceNesting::BalancedIf |
||||
|
||||
.method public hidebysig instance string |
||||
ComplexCase1(string s) cil managed |
||||
{ |
||||
// Code size 269 (0x10d) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
string V_1, |
||||
bool V_2, |
||||
int32 V_3) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.2 |
||||
IL_000c: ldloc.2 |
||||
IL_000d: brtrue.s IL_0017 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldarg.1 |
||||
IL_0011: stloc.1 |
||||
IL_0012: br IL_010b |
||||
|
||||
IL_0017: ldc.i4.0 |
||||
IL_0018: stloc.0 |
||||
IL_0019: br IL_00f7 |
||||
|
||||
IL_001e: nop |
||||
IL_001f: ldarg.0 |
||||
IL_0020: ldc.i4.1 |
||||
IL_0021: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0026: ldc.i4.0 |
||||
IL_0027: ceq |
||||
IL_0029: stloc.2 |
||||
IL_002a: ldloc.2 |
||||
IL_002b: brtrue.s IL_003b |
||||
|
||||
IL_002d: nop |
||||
IL_002e: ldc.i4.1 |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0034: nop |
||||
IL_0035: nop |
||||
IL_0036: br IL_00f2 |
||||
|
||||
IL_003b: ldarg.0 |
||||
IL_003c: ldc.i4.2 |
||||
IL_003d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0042: ldc.i4.0 |
||||
IL_0043: ceq |
||||
IL_0045: stloc.2 |
||||
IL_0046: ldloc.2 |
||||
IL_0047: brtrue.s IL_00b5 |
||||
|
||||
IL_0049: nop |
||||
IL_004a: ldloc.0 |
||||
IL_004b: stloc.3 |
||||
IL_004c: ldloc.3 |
||||
IL_004d: ldc.i4.1 |
||||
IL_004e: sub |
||||
IL_004f: switch ( |
||||
IL_0062, |
||||
IL_009e, |
||||
IL_009e) |
||||
IL_0060: br.s IL_00ab |
||||
|
||||
IL_0062: ldarg.0 |
||||
IL_0063: ldc.i4.3 |
||||
IL_0064: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0069: ldc.i4.0 |
||||
IL_006a: ceq |
||||
IL_006c: stloc.2 |
||||
IL_006d: ldloc.2 |
||||
IL_006e: brtrue.s IL_007a |
||||
|
||||
IL_0070: nop |
||||
IL_0071: ldc.i4.3 |
||||
IL_0072: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0077: nop |
||||
IL_0078: br.s IL_00ab |
||||
|
||||
IL_007a: ldstr "case1" |
||||
IL_007f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0084: nop |
||||
IL_0085: ldarg.0 |
||||
IL_0086: ldc.i4.4 |
||||
IL_0087: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_008c: ldc.i4.0 |
||||
IL_008d: ceq |
||||
IL_008f: stloc.2 |
||||
IL_0090: ldloc.2 |
||||
IL_0091: brtrue.s IL_009c |
||||
|
||||
IL_0093: nop |
||||
IL_0094: ldc.i4.4 |
||||
IL_0095: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_009a: nop |
||||
IL_009b: nop |
||||
IL_009c: br.s IL_00ab |
||||
|
||||
IL_009e: ldstr "case23" |
||||
IL_00a3: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00a8: nop |
||||
IL_00a9: br.s IL_00ab |
||||
|
||||
IL_00ab: ldc.i4.2 |
||||
IL_00ac: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00b1: nop |
||||
IL_00b2: nop |
||||
IL_00b3: br.s IL_00f2 |
||||
|
||||
IL_00b5: ldarg.0 |
||||
IL_00b6: ldc.i4.5 |
||||
IL_00b7: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_00bc: ldc.i4.0 |
||||
IL_00bd: ceq |
||||
IL_00bf: stloc.2 |
||||
IL_00c0: ldloc.2 |
||||
IL_00c1: brtrue.s IL_00ce |
||||
|
||||
IL_00c3: nop |
||||
IL_00c4: ldc.i4.5 |
||||
IL_00c5: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00ca: nop |
||||
IL_00cb: nop |
||||
IL_00cc: br.s IL_00f2 |
||||
|
||||
IL_00ce: nop |
||||
IL_00cf: ldarg.0 |
||||
IL_00d0: ldc.i4.6 |
||||
IL_00d1: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_00d6: ldc.i4.0 |
||||
IL_00d7: ceq |
||||
IL_00d9: stloc.2 |
||||
IL_00da: ldloc.2 |
||||
IL_00db: brtrue.s IL_00e6 |
||||
|
||||
IL_00dd: nop |
||||
IL_00de: ldc.i4.6 |
||||
IL_00df: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00e4: nop |
||||
IL_00e5: nop |
||||
IL_00e6: ldstr "else" |
||||
IL_00eb: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00f0: nop |
||||
IL_00f1: nop |
||||
IL_00f2: nop |
||||
IL_00f3: ldloc.0 |
||||
IL_00f4: ldc.i4.1 |
||||
IL_00f5: add |
||||
IL_00f6: stloc.0 |
||||
IL_00f7: ldloc.0 |
||||
IL_00f8: ldarg.1 |
||||
IL_00f9: callvirt instance int32 [mscorlib]System.String::get_Length() |
||||
IL_00fe: clt |
||||
IL_0100: stloc.2 |
||||
IL_0101: ldloc.2 |
||||
IL_0102: brtrue IL_001e |
||||
|
||||
IL_0107: ldarg.1 |
||||
IL_0108: stloc.1 |
||||
IL_0109: br.s IL_010b |
||||
|
||||
IL_010b: ldloc.1 |
||||
IL_010c: ret |
||||
} // end of method ReduceNesting::ComplexCase1 |
||||
|
||||
.method family 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 ReduceNesting::.ctor |
||||
|
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
||||
@ -0,0 +1,650 @@
@@ -0,0 +1,650 @@
|
||||
|
||||
|
||||
|
||||
|
||||
// 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 ReduceNesting.opt |
||||
{ |
||||
.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. |
||||
.permissionset reqmin |
||||
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} |
||||
.hash algorithm 0x00008004 |
||||
.ver 0:0:0:0 |
||||
} |
||||
.module ReduceNesting.opt.dll |
||||
.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 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class public abstract auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.method public hidebysig newslot abstract virtual |
||||
instance bool B(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::B |
||||
|
||||
.method public hidebysig newslot abstract virtual |
||||
instance int32 I(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::I |
||||
|
||||
.method public hidebysig instance void |
||||
IfIf() cil managed |
||||
{ |
||||
// Code size 42 (0x2a) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldarg.0 |
||||
IL_0011: ldc.i4.1 |
||||
IL_0012: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0017: brfalse.s IL_001f |
||||
|
||||
IL_0019: ldc.i4.1 |
||||
IL_001a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001f: ldstr "end" |
||||
IL_0024: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0029: ret |
||||
} // end of method ReduceNesting::IfIf |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitch() cil managed |
||||
{ |
||||
// Code size 83 (0x53) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldstr "switch" |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001a: ldarg.0 |
||||
IL_001b: ldc.i4.0 |
||||
IL_001c: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0021: stloc.0 |
||||
IL_0022: ldloc.0 |
||||
IL_0023: switch ( |
||||
IL_0032, |
||||
IL_003d) |
||||
IL_0030: br.s IL_0048 |
||||
|
||||
IL_0032: ldstr "case 0" |
||||
IL_0037: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003c: ret |
||||
|
||||
IL_003d: ldstr "case 1" |
||||
IL_0042: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0047: ret |
||||
|
||||
IL_0048: ldstr "end" |
||||
IL_004d: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0052: ret |
||||
} // end of method ReduceNesting::IfSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitchSwitch() cil managed |
||||
{ |
||||
// Code size 139 (0x8b) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
int32 V_1) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldstr "switch 0" |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001a: ldarg.0 |
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0021: stloc.0 |
||||
IL_0022: ldloc.0 |
||||
IL_0023: switch ( |
||||
IL_0032, |
||||
IL_003d) |
||||
IL_0030: br.s IL_0048 |
||||
|
||||
IL_0032: ldstr "case 0" |
||||
IL_0037: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003c: ret |
||||
|
||||
IL_003d: ldstr "case 1" |
||||
IL_0042: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0047: ret |
||||
|
||||
IL_0048: ldstr "switch 1" |
||||
IL_004d: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0052: ldarg.0 |
||||
IL_0053: ldc.i4.1 |
||||
IL_0054: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0059: stloc.1 |
||||
IL_005a: ldloc.1 |
||||
IL_005b: switch ( |
||||
IL_006a, |
||||
IL_0075) |
||||
IL_0068: br.s IL_0080 |
||||
|
||||
IL_006a: ldstr "case 0" |
||||
IL_006f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0074: ret |
||||
|
||||
IL_0075: ldstr "case 1" |
||||
IL_007a: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_007f: ret |
||||
|
||||
IL_0080: ldstr "end" |
||||
IL_0085: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_008a: ret |
||||
} // end of method ReduceNesting::IfSwitchSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfLoop() cil managed |
||||
{ |
||||
// Code size 46 (0x2e) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: stloc.0 |
||||
IL_0012: br.s IL_001e |
||||
|
||||
IL_0014: ldloc.0 |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001a: ldloc.0 |
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: add |
||||
IL_001d: stloc.0 |
||||
IL_001e: ldloc.0 |
||||
IL_001f: ldc.i4.s 10 |
||||
IL_0021: blt.s IL_0014 |
||||
|
||||
IL_0023: ldstr "end" |
||||
IL_0028: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002d: ret |
||||
} // end of method ReduceNesting::IfLoop |
||||
|
||||
.method public hidebysig instance void |
||||
LoopContinue() cil managed |
||||
{ |
||||
// Code size 62 (0x3e) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: br.s IL_0038 |
||||
|
||||
IL_0004: ldloc.0 |
||||
IL_0005: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000a: ldarg.0 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0011: brfalse.s IL_001b |
||||
|
||||
IL_0013: ldc.i4.0 |
||||
IL_0014: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0019: br.s IL_0034 |
||||
|
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: brfalse.s IL_002a |
||||
|
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: ldstr "loop-tail" |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0034: ldloc.0 |
||||
IL_0035: ldc.i4.1 |
||||
IL_0036: add |
||||
IL_0037: stloc.0 |
||||
IL_0038: ldloc.0 |
||||
IL_0039: ldc.i4.s 10 |
||||
IL_003b: blt.s IL_0004 |
||||
|
||||
IL_003d: ret |
||||
} // end of method ReduceNesting::LoopContinue |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreak() cil managed |
||||
{ |
||||
// Code size 91 (0x5b) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: br.s IL_004b |
||||
|
||||
IL_0004: ldloc.0 |
||||
IL_0005: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000a: ldarg.0 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0011: brfalse.s IL_001b |
||||
|
||||
IL_0013: ldc.i4.0 |
||||
IL_0014: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0019: br.s IL_0047 |
||||
|
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: brfalse.s IL_002c |
||||
|
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: br.s IL_0050 |
||||
|
||||
IL_002c: ldarg.0 |
||||
IL_002d: ldc.i4.2 |
||||
IL_002e: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0033: brfalse.s IL_003b |
||||
|
||||
IL_0035: ldc.i4.2 |
||||
IL_0036: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003b: ldstr "break" |
||||
IL_0040: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0045: br.s IL_0050 |
||||
|
||||
IL_0047: ldloc.0 |
||||
IL_0048: ldc.i4.1 |
||||
IL_0049: add |
||||
IL_004a: stloc.0 |
||||
IL_004b: ldloc.0 |
||||
IL_004c: ldc.i4.s 10 |
||||
IL_004e: blt.s IL_0004 |
||||
|
||||
IL_0050: ldstr "end" |
||||
IL_0055: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_005a: ret |
||||
} // end of method ReduceNesting::LoopBreak |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreakElseIf() cil managed |
||||
{ |
||||
// Code size 81 (0x51) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: br.s IL_0041 |
||||
|
||||
IL_0004: ldloc.0 |
||||
IL_0005: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000a: ldarg.0 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0011: brfalse.s IL_001b |
||||
|
||||
IL_0013: ldc.i4.0 |
||||
IL_0014: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0019: br.s IL_003d |
||||
|
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: brfalse.s IL_002c |
||||
|
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: br.s IL_0046 |
||||
|
||||
IL_002c: ldarg.0 |
||||
IL_002d: ldc.i4.2 |
||||
IL_002e: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0033: brfalse.s IL_0046 |
||||
|
||||
IL_0035: ldc.i4.2 |
||||
IL_0036: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003b: br.s IL_0046 |
||||
|
||||
IL_003d: ldloc.0 |
||||
IL_003e: ldc.i4.1 |
||||
IL_003f: add |
||||
IL_0040: stloc.0 |
||||
IL_0041: ldloc.0 |
||||
IL_0042: ldc.i4.s 10 |
||||
IL_0044: blt.s IL_0004 |
||||
|
||||
IL_0046: ldstr "end" |
||||
IL_004b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0050: ret |
||||
} // end of method ReduceNesting::LoopBreakElseIf |
||||
|
||||
.method public hidebysig instance void |
||||
SwitchIf() cil managed |
||||
{ |
||||
// Code size 72 (0x48) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0007: stloc.0 |
||||
IL_0008: ldloc.0 |
||||
IL_0009: switch ( |
||||
IL_0018, |
||||
IL_0023) |
||||
IL_0016: br.s IL_002e |
||||
|
||||
IL_0018: ldstr "case 0" |
||||
IL_001d: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0022: ret |
||||
|
||||
IL_0023: ldstr "case 1" |
||||
IL_0028: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002d: ret |
||||
|
||||
IL_002e: ldarg.0 |
||||
IL_002f: ldc.i4.0 |
||||
IL_0030: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0035: brfalse.s IL_003d |
||||
|
||||
IL_0037: ldc.i4.0 |
||||
IL_0038: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003d: ldstr "end" |
||||
IL_0042: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0047: ret |
||||
} // end of method ReduceNesting::SwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
NestedSwitchIf() cil managed |
||||
{ |
||||
// Code size 82 (0x52) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0047 |
||||
|
||||
IL_0009: ldarg.0 |
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0010: stloc.0 |
||||
IL_0011: ldloc.0 |
||||
IL_0012: switch ( |
||||
IL_0021, |
||||
IL_002c) |
||||
IL_001f: br.s IL_0037 |
||||
|
||||
IL_0021: ldstr "case 0" |
||||
IL_0026: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002b: ret |
||||
|
||||
IL_002c: ldstr "case 1" |
||||
IL_0031: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0036: ret |
||||
|
||||
IL_0037: ldarg.0 |
||||
IL_0038: ldc.i4.1 |
||||
IL_0039: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003e: brfalse.s IL_0051 |
||||
|
||||
IL_0040: ldc.i4.1 |
||||
IL_0041: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0046: ret |
||||
|
||||
IL_0047: ldstr "else" |
||||
IL_004c: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0051: ret |
||||
} // end of method ReduceNesting::NestedSwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit1() cil managed |
||||
{ |
||||
// Code size 39 (0x27) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brtrue.s IL_0026 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: stloc.0 |
||||
IL_000b: br.s IL_0017 |
||||
|
||||
IL_000d: ldloc.0 |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0013: ldloc.0 |
||||
IL_0014: ldc.i4.1 |
||||
IL_0015: add |
||||
IL_0016: stloc.0 |
||||
IL_0017: ldloc.0 |
||||
IL_0018: ldc.i4.s 10 |
||||
IL_001a: blt.s IL_000d |
||||
|
||||
IL_001c: ldstr "end" |
||||
IL_0021: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0026: ret |
||||
} // end of method ReduceNesting::EarlyExit1 |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit2() cil managed |
||||
{ |
||||
// Code size 55 (0x37) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_000a |
||||
|
||||
IL_0009: ret |
||||
|
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: stloc.0 |
||||
IL_000c: br.s IL_0027 |
||||
|
||||
IL_000e: ldloc.0 |
||||
IL_000f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0014: ldloc.0 |
||||
IL_0015: ldc.i4.2 |
||||
IL_0016: rem |
||||
IL_0017: brtrue.s IL_0023 |
||||
|
||||
IL_0019: ldstr "even" |
||||
IL_001e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0023: ldloc.0 |
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: add |
||||
IL_0026: stloc.0 |
||||
IL_0027: ldloc.0 |
||||
IL_0028: ldc.i4.s 10 |
||||
IL_002a: blt.s IL_000e |
||||
|
||||
IL_002c: ldstr "end" |
||||
IL_0031: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0036: ret |
||||
} // end of method ReduceNesting::EarlyExit2 |
||||
|
||||
.method public hidebysig instance void |
||||
BalancedIf() cil managed |
||||
{ |
||||
// Code size 61 (0x3d) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0023 |
||||
|
||||
IL_0009: ldstr "true" |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0013: ldarg.0 |
||||
IL_0014: ldc.i4.1 |
||||
IL_0015: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_001a: brfalse.s IL_003c |
||||
|
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0022: ret |
||||
|
||||
IL_0023: ldarg.0 |
||||
IL_0024: ldc.i4.2 |
||||
IL_0025: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002a: brfalse.s IL_0032 |
||||
|
||||
IL_002c: ldc.i4.2 |
||||
IL_002d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0032: ldstr "false" |
||||
IL_0037: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003c: ret |
||||
} // end of method ReduceNesting::BalancedIf |
||||
|
||||
.method public hidebysig instance string |
||||
ComplexCase1(string s) cil managed |
||||
{ |
||||
// Code size 193 (0xc1) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
int32 V_1) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_000b |
||||
|
||||
IL_0009: ldarg.1 |
||||
IL_000a: ret |
||||
|
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: stloc.0 |
||||
IL_000d: br IL_00b3 |
||||
|
||||
IL_0012: ldarg.0 |
||||
IL_0013: ldc.i4.1 |
||||
IL_0014: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0019: brfalse.s IL_0026 |
||||
|
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0021: br IL_00af |
||||
|
||||
IL_0026: ldarg.0 |
||||
IL_0027: ldc.i4.2 |
||||
IL_0028: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002d: brfalse.s IL_0085 |
||||
|
||||
IL_002f: ldloc.0 |
||||
IL_0030: stloc.1 |
||||
IL_0031: ldloc.1 |
||||
IL_0032: ldc.i4.1 |
||||
IL_0033: sub |
||||
IL_0034: switch ( |
||||
IL_0047, |
||||
IL_0073, |
||||
IL_0073) |
||||
IL_0045: br.s IL_007d |
||||
|
||||
IL_0047: ldarg.0 |
||||
IL_0048: ldc.i4.3 |
||||
IL_0049: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_004e: brfalse.s IL_0058 |
||||
|
||||
IL_0050: ldc.i4.3 |
||||
IL_0051: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0056: br.s IL_007d |
||||
|
||||
IL_0058: ldstr "case1" |
||||
IL_005d: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0062: ldarg.0 |
||||
IL_0063: ldc.i4.4 |
||||
IL_0064: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0069: brfalse.s IL_007d |
||||
|
||||
IL_006b: ldc.i4.4 |
||||
IL_006c: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0071: br.s IL_007d |
||||
|
||||
IL_0073: ldstr "case23" |
||||
IL_0078: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_007d: ldc.i4.2 |
||||
IL_007e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0083: br.s IL_00af |
||||
|
||||
IL_0085: ldarg.0 |
||||
IL_0086: ldc.i4.5 |
||||
IL_0087: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_008c: brfalse.s IL_0096 |
||||
|
||||
IL_008e: ldc.i4.5 |
||||
IL_008f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0094: br.s IL_00af |
||||
|
||||
IL_0096: ldarg.0 |
||||
IL_0097: ldc.i4.6 |
||||
IL_0098: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_009d: brfalse.s IL_00a5 |
||||
|
||||
IL_009f: ldc.i4.6 |
||||
IL_00a0: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00a5: ldstr "else" |
||||
IL_00aa: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00af: ldloc.0 |
||||
IL_00b0: ldc.i4.1 |
||||
IL_00b1: add |
||||
IL_00b2: stloc.0 |
||||
IL_00b3: ldloc.0 |
||||
IL_00b4: ldarg.1 |
||||
IL_00b5: callvirt instance int32 [mscorlib]System.String::get_Length() |
||||
IL_00ba: blt IL_0012 |
||||
|
||||
IL_00bf: ldarg.1 |
||||
IL_00c0: ret |
||||
} // end of method ReduceNesting::ComplexCase1 |
||||
|
||||
.method family 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 ReduceNesting::.ctor |
||||
|
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
||||
@ -0,0 +1,668 @@
@@ -0,0 +1,668 @@
|
||||
|
||||
|
||||
|
||||
|
||||
// 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 ReduceNesting |
||||
{ |
||||
.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 ReduceNesting.dll |
||||
.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 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class public abstract auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.method public hidebysig newslot abstract virtual |
||||
instance bool B(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::B |
||||
|
||||
.method public hidebysig newslot abstract virtual |
||||
instance int32 I(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::I |
||||
|
||||
.method public hidebysig instance void |
||||
IfIf() cil managed |
||||
{ |
||||
// Code size 42 (0x2a) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldarg.0 |
||||
IL_0011: ldc.i4.1 |
||||
IL_0012: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0017: brfalse.s IL_001f |
||||
|
||||
IL_0019: ldc.i4.1 |
||||
IL_001a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001f: ldstr "end" |
||||
IL_0024: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0029: ret |
||||
} // end of method ReduceNesting::IfIf |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitch() cil managed |
||||
{ |
||||
// Code size 76 (0x4c) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldstr "switch" |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001a: ldarg.0 |
||||
IL_001b: ldc.i4.0 |
||||
IL_001c: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0021: stloc.0 |
||||
IL_0022: ldloc.0 |
||||
IL_0023: brfalse.s IL_002b |
||||
|
||||
IL_0025: ldloc.0 |
||||
IL_0026: ldc.i4.1 |
||||
IL_0027: beq.s IL_0036 |
||||
|
||||
IL_0029: br.s IL_0041 |
||||
|
||||
IL_002b: ldstr "case 0" |
||||
IL_0030: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0035: ret |
||||
|
||||
IL_0036: ldstr "case 1" |
||||
IL_003b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0040: ret |
||||
|
||||
IL_0041: ldstr "end" |
||||
IL_0046: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004b: ret |
||||
} // end of method ReduceNesting::IfSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitchSwitch() cil managed |
||||
{ |
||||
// Code size 125 (0x7d) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldstr "switch 0" |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001a: ldarg.0 |
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0021: stloc.0 |
||||
IL_0022: ldloc.0 |
||||
IL_0023: brfalse.s IL_002b |
||||
|
||||
IL_0025: ldloc.0 |
||||
IL_0026: ldc.i4.1 |
||||
IL_0027: beq.s IL_0036 |
||||
|
||||
IL_0029: br.s IL_0041 |
||||
|
||||
IL_002b: ldstr "case 0" |
||||
IL_0030: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0035: ret |
||||
|
||||
IL_0036: ldstr "case 1" |
||||
IL_003b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0040: ret |
||||
|
||||
IL_0041: ldstr "switch 1" |
||||
IL_0046: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004b: ldarg.0 |
||||
IL_004c: ldc.i4.1 |
||||
IL_004d: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0052: stloc.0 |
||||
IL_0053: ldloc.0 |
||||
IL_0054: brfalse.s IL_005c |
||||
|
||||
IL_0056: ldloc.0 |
||||
IL_0057: ldc.i4.1 |
||||
IL_0058: beq.s IL_0067 |
||||
|
||||
IL_005a: br.s IL_0072 |
||||
|
||||
IL_005c: ldstr "case 0" |
||||
IL_0061: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0066: ret |
||||
|
||||
IL_0067: ldstr "case 1" |
||||
IL_006c: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0071: ret |
||||
|
||||
IL_0072: ldstr "end" |
||||
IL_0077: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_007c: ret |
||||
} // end of method ReduceNesting::IfSwitchSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfLoop() cil managed |
||||
{ |
||||
// Code size 46 (0x2e) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0010 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000f: ret |
||||
|
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: stloc.0 |
||||
IL_0012: br.s IL_001e |
||||
|
||||
IL_0014: ldloc.0 |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001a: ldloc.0 |
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: add |
||||
IL_001d: stloc.0 |
||||
IL_001e: ldloc.0 |
||||
IL_001f: ldc.i4.s 10 |
||||
IL_0021: blt.s IL_0014 |
||||
|
||||
IL_0023: ldstr "end" |
||||
IL_0028: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002d: ret |
||||
} // end of method ReduceNesting::IfLoop |
||||
|
||||
.method public hidebysig instance void |
||||
LoopContinue() cil managed |
||||
{ |
||||
// Code size 62 (0x3e) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: br.s IL_0038 |
||||
|
||||
IL_0004: ldloc.0 |
||||
IL_0005: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000a: ldarg.0 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0011: brfalse.s IL_001b |
||||
|
||||
IL_0013: ldc.i4.0 |
||||
IL_0014: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0019: br.s IL_0034 |
||||
|
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: brfalse.s IL_002a |
||||
|
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: ldstr "loop-tail" |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0034: ldloc.0 |
||||
IL_0035: ldc.i4.1 |
||||
IL_0036: add |
||||
IL_0037: stloc.0 |
||||
IL_0038: ldloc.0 |
||||
IL_0039: ldc.i4.s 10 |
||||
IL_003b: blt.s IL_0004 |
||||
|
||||
IL_003d: ret |
||||
} // end of method ReduceNesting::LoopContinue |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreak() cil managed |
||||
{ |
||||
// Code size 91 (0x5b) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: br.s IL_004b |
||||
|
||||
IL_0004: ldloc.0 |
||||
IL_0005: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000a: ldarg.0 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0011: brfalse.s IL_001b |
||||
|
||||
IL_0013: ldc.i4.0 |
||||
IL_0014: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0019: br.s IL_0047 |
||||
|
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: brfalse.s IL_002c |
||||
|
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: br.s IL_0050 |
||||
|
||||
IL_002c: ldarg.0 |
||||
IL_002d: ldc.i4.2 |
||||
IL_002e: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0033: brfalse.s IL_003b |
||||
|
||||
IL_0035: ldc.i4.2 |
||||
IL_0036: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003b: ldstr "break" |
||||
IL_0040: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0045: br.s IL_0050 |
||||
|
||||
IL_0047: ldloc.0 |
||||
IL_0048: ldc.i4.1 |
||||
IL_0049: add |
||||
IL_004a: stloc.0 |
||||
IL_004b: ldloc.0 |
||||
IL_004c: ldc.i4.s 10 |
||||
IL_004e: blt.s IL_0004 |
||||
|
||||
IL_0050: ldstr "end" |
||||
IL_0055: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_005a: ret |
||||
} // end of method ReduceNesting::LoopBreak |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreakElseIf() cil managed |
||||
{ |
||||
// Code size 81 (0x51) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldc.i4.0 |
||||
IL_0001: stloc.0 |
||||
IL_0002: br.s IL_0041 |
||||
|
||||
IL_0004: ldloc.0 |
||||
IL_0005: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000a: ldarg.0 |
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0011: brfalse.s IL_001b |
||||
|
||||
IL_0013: ldc.i4.0 |
||||
IL_0014: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0019: br.s IL_003d |
||||
|
||||
IL_001b: ldarg.0 |
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0022: brfalse.s IL_002c |
||||
|
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: br.s IL_0046 |
||||
|
||||
IL_002c: ldarg.0 |
||||
IL_002d: ldc.i4.2 |
||||
IL_002e: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0033: brfalse.s IL_0046 |
||||
|
||||
IL_0035: ldc.i4.2 |
||||
IL_0036: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003b: br.s IL_0046 |
||||
|
||||
IL_003d: ldloc.0 |
||||
IL_003e: ldc.i4.1 |
||||
IL_003f: add |
||||
IL_0040: stloc.0 |
||||
IL_0041: ldloc.0 |
||||
IL_0042: ldc.i4.s 10 |
||||
IL_0044: blt.s IL_0004 |
||||
|
||||
IL_0046: ldstr "end" |
||||
IL_004b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0050: ret |
||||
} // end of method ReduceNesting::LoopBreakElseIf |
||||
|
||||
.method public hidebysig instance void |
||||
SwitchIf() cil managed |
||||
{ |
||||
// Code size 65 (0x41) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0007: stloc.0 |
||||
IL_0008: ldloc.0 |
||||
IL_0009: brfalse.s IL_0011 |
||||
|
||||
IL_000b: ldloc.0 |
||||
IL_000c: ldc.i4.1 |
||||
IL_000d: beq.s IL_001c |
||||
|
||||
IL_000f: br.s IL_0027 |
||||
|
||||
IL_0011: ldstr "case 0" |
||||
IL_0016: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001b: ret |
||||
|
||||
IL_001c: ldstr "case 1" |
||||
IL_0021: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0026: ret |
||||
|
||||
IL_0027: ldarg.0 |
||||
IL_0028: ldc.i4.0 |
||||
IL_0029: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002e: brfalse.s IL_0036 |
||||
|
||||
IL_0030: ldc.i4.0 |
||||
IL_0031: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0036: ldstr "end" |
||||
IL_003b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0040: ret |
||||
} // end of method ReduceNesting::SwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
NestedSwitchIf() cil managed |
||||
{ |
||||
// Code size 75 (0x4b) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0040 |
||||
|
||||
IL_0009: ldarg.0 |
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0010: stloc.0 |
||||
IL_0011: ldloc.0 |
||||
IL_0012: brfalse.s IL_001a |
||||
|
||||
IL_0014: ldloc.0 |
||||
IL_0015: ldc.i4.1 |
||||
IL_0016: beq.s IL_0025 |
||||
|
||||
IL_0018: br.s IL_0030 |
||||
|
||||
IL_001a: ldstr "case 0" |
||||
IL_001f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0024: ret |
||||
|
||||
IL_0025: ldstr "case 1" |
||||
IL_002a: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002f: ret |
||||
|
||||
IL_0030: ldarg.0 |
||||
IL_0031: ldc.i4.1 |
||||
IL_0032: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0037: brfalse.s IL_004a |
||||
|
||||
IL_0039: ldc.i4.1 |
||||
IL_003a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_003f: ret |
||||
|
||||
IL_0040: ldstr "else" |
||||
IL_0045: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004a: ret |
||||
} // end of method ReduceNesting::NestedSwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit1() cil managed |
||||
{ |
||||
// Code size 39 (0x27) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brtrue.s IL_0026 |
||||
|
||||
IL_0009: ldc.i4.0 |
||||
IL_000a: stloc.0 |
||||
IL_000b: br.s IL_0017 |
||||
|
||||
IL_000d: ldloc.0 |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0013: ldloc.0 |
||||
IL_0014: ldc.i4.1 |
||||
IL_0015: add |
||||
IL_0016: stloc.0 |
||||
IL_0017: ldloc.0 |
||||
IL_0018: ldc.i4.s 10 |
||||
IL_001a: blt.s IL_000d |
||||
|
||||
IL_001c: ldstr "end" |
||||
IL_0021: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0026: ret |
||||
} // end of method ReduceNesting::EarlyExit1 |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit2() cil managed |
||||
{ |
||||
// Code size 55 (0x37) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_000a |
||||
|
||||
IL_0009: ret |
||||
|
||||
IL_000a: ldc.i4.0 |
||||
IL_000b: stloc.0 |
||||
IL_000c: br.s IL_0027 |
||||
|
||||
IL_000e: ldloc.0 |
||||
IL_000f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0014: ldloc.0 |
||||
IL_0015: ldc.i4.2 |
||||
IL_0016: rem |
||||
IL_0017: brtrue.s IL_0023 |
||||
|
||||
IL_0019: ldstr "even" |
||||
IL_001e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0023: ldloc.0 |
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: add |
||||
IL_0026: stloc.0 |
||||
IL_0027: ldloc.0 |
||||
IL_0028: ldc.i4.s 10 |
||||
IL_002a: blt.s IL_000e |
||||
|
||||
IL_002c: ldstr "end" |
||||
IL_0031: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0036: ret |
||||
} // end of method ReduceNesting::EarlyExit2 |
||||
|
||||
.method public hidebysig instance void |
||||
BalancedIf() cil managed |
||||
{ |
||||
// Code size 61 (0x3d) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_0023 |
||||
|
||||
IL_0009: ldstr "true" |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0013: ldarg.0 |
||||
IL_0014: ldc.i4.1 |
||||
IL_0015: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_001a: brfalse.s IL_003c |
||||
|
||||
IL_001c: ldc.i4.1 |
||||
IL_001d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0022: ret |
||||
|
||||
IL_0023: ldarg.0 |
||||
IL_0024: ldc.i4.2 |
||||
IL_0025: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002a: brfalse.s IL_0032 |
||||
|
||||
IL_002c: ldc.i4.2 |
||||
IL_002d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0032: ldstr "false" |
||||
IL_0037: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003c: ret |
||||
} // end of method ReduceNesting::BalancedIf |
||||
|
||||
.method public hidebysig instance string |
||||
ComplexCase1(string s) cil managed |
||||
{ |
||||
// Code size 178 (0xb2) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0) |
||||
IL_0000: ldarg.0 |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0007: brfalse.s IL_000b |
||||
|
||||
IL_0009: ldarg.1 |
||||
IL_000a: ret |
||||
|
||||
IL_000b: ldc.i4.0 |
||||
IL_000c: stloc.0 |
||||
IL_000d: br IL_00a4 |
||||
|
||||
IL_0012: ldarg.0 |
||||
IL_0013: ldc.i4.1 |
||||
IL_0014: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0019: brfalse.s IL_0023 |
||||
|
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0021: br.s IL_00a0 |
||||
|
||||
IL_0023: ldarg.0 |
||||
IL_0024: ldc.i4.2 |
||||
IL_0025: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_002a: brfalse.s IL_0076 |
||||
|
||||
IL_002c: ldloc.0 |
||||
IL_002d: ldc.i4.1 |
||||
IL_002e: beq.s IL_0038 |
||||
|
||||
IL_0030: ldloc.0 |
||||
IL_0031: ldc.i4.2 |
||||
IL_0032: sub |
||||
IL_0033: ldc.i4.1 |
||||
IL_0034: ble.un.s IL_0064 |
||||
|
||||
IL_0036: br.s IL_006e |
||||
|
||||
IL_0038: ldarg.0 |
||||
IL_0039: ldc.i4.3 |
||||
IL_003a: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003f: brfalse.s IL_0049 |
||||
|
||||
IL_0041: ldc.i4.3 |
||||
IL_0042: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0047: br.s IL_006e |
||||
|
||||
IL_0049: ldstr "case1" |
||||
IL_004e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0053: ldarg.0 |
||||
IL_0054: ldc.i4.4 |
||||
IL_0055: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_005a: brfalse.s IL_006e |
||||
|
||||
IL_005c: ldc.i4.4 |
||||
IL_005d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0062: br.s IL_006e |
||||
|
||||
IL_0064: ldstr "case23" |
||||
IL_0069: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_006e: ldc.i4.2 |
||||
IL_006f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0074: br.s IL_00a0 |
||||
|
||||
IL_0076: ldarg.0 |
||||
IL_0077: ldc.i4.5 |
||||
IL_0078: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_007d: brfalse.s IL_0087 |
||||
|
||||
IL_007f: ldc.i4.5 |
||||
IL_0080: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0085: br.s IL_00a0 |
||||
|
||||
IL_0087: ldarg.0 |
||||
IL_0088: ldc.i4.6 |
||||
IL_0089: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_008e: brfalse.s IL_0096 |
||||
|
||||
IL_0090: ldc.i4.6 |
||||
IL_0091: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0096: ldstr "else" |
||||
IL_009b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00a0: ldloc.0 |
||||
IL_00a1: ldc.i4.1 |
||||
IL_00a2: add |
||||
IL_00a3: stloc.0 |
||||
IL_00a4: ldloc.0 |
||||
IL_00a5: ldarg.1 |
||||
IL_00a6: callvirt instance int32 [mscorlib]System.String::get_Length() |
||||
IL_00ab: blt IL_0012 |
||||
|
||||
IL_00b0: ldarg.1 |
||||
IL_00b1: ret |
||||
} // end of method ReduceNesting::ComplexCase1 |
||||
|
||||
.method family 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 ReduceNesting::.ctor |
||||
|
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
||||
@ -0,0 +1,954 @@
@@ -0,0 +1,954 @@
|
||||
|
||||
|
||||
|
||||
|
||||
// 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 ReduceNesting |
||||
{ |
||||
.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 ReduceNesting.dll |
||||
.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 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class public abstract auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.method public hidebysig newslot abstract virtual |
||||
instance bool B(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::B |
||||
|
||||
.method public hidebysig newslot abstract virtual |
||||
instance int32 I(int32 i) cil managed |
||||
{ |
||||
} // end of method ReduceNesting::I |
||||
|
||||
.method public hidebysig instance void |
||||
IfIf() cil managed |
||||
{ |
||||
// Code size 54 (0x36) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0016 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0013: nop |
||||
IL_0014: br.s IL_0035 |
||||
|
||||
IL_0016: ldarg.0 |
||||
IL_0017: ldc.i4.1 |
||||
IL_0018: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_001d: stloc.1 |
||||
IL_001e: ldloc.1 |
||||
IL_001f: brfalse.s IL_002a |
||||
|
||||
IL_0021: nop |
||||
IL_0022: ldc.i4.1 |
||||
IL_0023: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0028: nop |
||||
IL_0029: nop |
||||
IL_002a: ldstr "end" |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0034: nop |
||||
IL_0035: ret |
||||
} // end of method ReduceNesting::IfIf |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitch() cil managed |
||||
{ |
||||
// Code size 92 (0x5c) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0016 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0013: nop |
||||
IL_0014: br.s IL_005b |
||||
|
||||
IL_0016: ldstr "switch" |
||||
IL_001b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0020: nop |
||||
IL_0021: ldarg.0 |
||||
IL_0022: ldc.i4.0 |
||||
IL_0023: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0028: stloc.1 |
||||
IL_0029: ldloc.1 |
||||
IL_002a: brfalse.s IL_0034 |
||||
|
||||
IL_002c: br.s IL_002e |
||||
|
||||
IL_002e: ldloc.1 |
||||
IL_002f: ldc.i4.1 |
||||
IL_0030: beq.s IL_0041 |
||||
|
||||
IL_0032: br.s IL_004e |
||||
|
||||
IL_0034: ldstr "case 0" |
||||
IL_0039: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003e: nop |
||||
IL_003f: br.s IL_005b |
||||
|
||||
IL_0041: ldstr "case 1" |
||||
IL_0046: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004b: nop |
||||
IL_004c: br.s IL_005b |
||||
|
||||
IL_004e: ldstr "end" |
||||
IL_0053: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0058: nop |
||||
IL_0059: br.s IL_005b |
||||
|
||||
IL_005b: ret |
||||
} // end of method ReduceNesting::IfSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfSwitchSwitch() cil managed |
||||
{ |
||||
// Code size 148 (0x94) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1, |
||||
int32 V_2) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0016 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0013: nop |
||||
IL_0014: br.s IL_0093 |
||||
|
||||
IL_0016: ldstr "switch 0" |
||||
IL_001b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0020: nop |
||||
IL_0021: ldarg.0 |
||||
IL_0022: ldc.i4.1 |
||||
IL_0023: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0028: stloc.1 |
||||
IL_0029: ldloc.1 |
||||
IL_002a: brfalse.s IL_0034 |
||||
|
||||
IL_002c: br.s IL_002e |
||||
|
||||
IL_002e: ldloc.1 |
||||
IL_002f: ldc.i4.1 |
||||
IL_0030: beq.s IL_0041 |
||||
|
||||
IL_0032: br.s IL_004e |
||||
|
||||
IL_0034: ldstr "case 0" |
||||
IL_0039: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003e: nop |
||||
IL_003f: br.s IL_0093 |
||||
|
||||
IL_0041: ldstr "case 1" |
||||
IL_0046: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004b: nop |
||||
IL_004c: br.s IL_0093 |
||||
|
||||
IL_004e: ldstr "switch 1" |
||||
IL_0053: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0058: nop |
||||
IL_0059: ldarg.0 |
||||
IL_005a: ldc.i4.1 |
||||
IL_005b: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0060: stloc.2 |
||||
IL_0061: ldloc.2 |
||||
IL_0062: brfalse.s IL_006c |
||||
|
||||
IL_0064: br.s IL_0066 |
||||
|
||||
IL_0066: ldloc.2 |
||||
IL_0067: ldc.i4.1 |
||||
IL_0068: beq.s IL_0079 |
||||
|
||||
IL_006a: br.s IL_0086 |
||||
|
||||
IL_006c: ldstr "case 0" |
||||
IL_0071: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0076: nop |
||||
IL_0077: br.s IL_0093 |
||||
|
||||
IL_0079: ldstr "case 1" |
||||
IL_007e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0083: nop |
||||
IL_0084: br.s IL_0093 |
||||
|
||||
IL_0086: ldstr "end" |
||||
IL_008b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0090: nop |
||||
IL_0091: br.s IL_0093 |
||||
|
||||
IL_0093: ret |
||||
} // end of method ReduceNesting::IfSwitchSwitch |
||||
|
||||
.method public hidebysig instance void |
||||
IfLoop() cil managed |
||||
{ |
||||
// Code size 60 (0x3c) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1, |
||||
bool V_2) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0016 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldc.i4.0 |
||||
IL_000e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0013: nop |
||||
IL_0014: br.s IL_003b |
||||
|
||||
IL_0016: ldc.i4.0 |
||||
IL_0017: stloc.1 |
||||
IL_0018: br.s IL_0027 |
||||
|
||||
IL_001a: nop |
||||
IL_001b: ldloc.1 |
||||
IL_001c: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0021: nop |
||||
IL_0022: nop |
||||
IL_0023: ldloc.1 |
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: add |
||||
IL_0026: stloc.1 |
||||
IL_0027: ldloc.1 |
||||
IL_0028: ldc.i4.s 10 |
||||
IL_002a: clt |
||||
IL_002c: stloc.2 |
||||
IL_002d: ldloc.2 |
||||
IL_002e: brtrue.s IL_001a |
||||
|
||||
IL_0030: ldstr "end" |
||||
IL_0035: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_003a: nop |
||||
IL_003b: ret |
||||
} // end of method ReduceNesting::IfLoop |
||||
|
||||
.method public hidebysig instance void |
||||
LoopContinue() cil managed |
||||
{ |
||||
// Code size 80 (0x50) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1, |
||||
bool V_2, |
||||
bool V_3) |
||||
IL_0000: nop |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: stloc.0 |
||||
IL_0003: br.s IL_0046 |
||||
|
||||
IL_0005: nop |
||||
IL_0006: ldloc.0 |
||||
IL_0007: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0014: stloc.1 |
||||
IL_0015: ldloc.1 |
||||
IL_0016: brfalse.s IL_0022 |
||||
|
||||
IL_0018: nop |
||||
IL_0019: ldc.i4.0 |
||||
IL_001a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001f: nop |
||||
IL_0020: br.s IL_0042 |
||||
|
||||
IL_0022: ldarg.0 |
||||
IL_0023: ldc.i4.1 |
||||
IL_0024: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0029: stloc.2 |
||||
IL_002a: ldloc.2 |
||||
IL_002b: brfalse.s IL_0036 |
||||
|
||||
IL_002d: nop |
||||
IL_002e: ldc.i4.1 |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0034: nop |
||||
IL_0035: nop |
||||
IL_0036: ldstr "loop-tail" |
||||
IL_003b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0040: nop |
||||
IL_0041: nop |
||||
IL_0042: ldloc.0 |
||||
IL_0043: ldc.i4.1 |
||||
IL_0044: add |
||||
IL_0045: stloc.0 |
||||
IL_0046: ldloc.0 |
||||
IL_0047: ldc.i4.s 10 |
||||
IL_0049: clt |
||||
IL_004b: stloc.3 |
||||
IL_004c: ldloc.3 |
||||
IL_004d: brtrue.s IL_0005 |
||||
|
||||
IL_004f: ret |
||||
} // end of method ReduceNesting::LoopContinue |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreak() cil managed |
||||
{ |
||||
// Code size 115 (0x73) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1, |
||||
bool V_2, |
||||
bool V_3, |
||||
bool V_4) |
||||
IL_0000: nop |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: stloc.0 |
||||
IL_0003: br.s IL_005c |
||||
|
||||
IL_0005: nop |
||||
IL_0006: ldloc.0 |
||||
IL_0007: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0014: stloc.1 |
||||
IL_0015: ldloc.1 |
||||
IL_0016: brfalse.s IL_0022 |
||||
|
||||
IL_0018: nop |
||||
IL_0019: ldc.i4.0 |
||||
IL_001a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001f: nop |
||||
IL_0020: br.s IL_0058 |
||||
|
||||
IL_0022: ldarg.0 |
||||
IL_0023: ldc.i4.1 |
||||
IL_0024: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0029: stloc.2 |
||||
IL_002a: ldloc.2 |
||||
IL_002b: brfalse.s IL_0037 |
||||
|
||||
IL_002d: nop |
||||
IL_002e: ldc.i4.1 |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0034: nop |
||||
IL_0035: br.s IL_0067 |
||||
|
||||
IL_0037: ldarg.0 |
||||
IL_0038: ldc.i4.2 |
||||
IL_0039: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003e: stloc.3 |
||||
IL_003f: ldloc.3 |
||||
IL_0040: brfalse.s IL_004b |
||||
|
||||
IL_0042: nop |
||||
IL_0043: ldc.i4.2 |
||||
IL_0044: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0049: nop |
||||
IL_004a: nop |
||||
IL_004b: ldstr "break" |
||||
IL_0050: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0055: nop |
||||
IL_0056: br.s IL_0067 |
||||
|
||||
IL_0058: ldloc.0 |
||||
IL_0059: ldc.i4.1 |
||||
IL_005a: add |
||||
IL_005b: stloc.0 |
||||
IL_005c: ldloc.0 |
||||
IL_005d: ldc.i4.s 10 |
||||
IL_005f: clt |
||||
IL_0061: stloc.s V_4 |
||||
IL_0063: ldloc.s V_4 |
||||
IL_0065: brtrue.s IL_0005 |
||||
|
||||
IL_0067: ldstr "end" |
||||
IL_006c: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0071: nop |
||||
IL_0072: ret |
||||
} // end of method ReduceNesting::LoopBreak |
||||
|
||||
.method public hidebysig instance void |
||||
LoopBreakElseIf() cil managed |
||||
{ |
||||
// Code size 105 (0x69) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1, |
||||
bool V_2, |
||||
bool V_3, |
||||
bool V_4) |
||||
IL_0000: nop |
||||
IL_0001: ldc.i4.0 |
||||
IL_0002: stloc.0 |
||||
IL_0003: br.s IL_0052 |
||||
|
||||
IL_0005: nop |
||||
IL_0006: ldloc.0 |
||||
IL_0007: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0014: stloc.1 |
||||
IL_0015: ldloc.1 |
||||
IL_0016: brfalse.s IL_0022 |
||||
|
||||
IL_0018: nop |
||||
IL_0019: ldc.i4.0 |
||||
IL_001a: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001f: nop |
||||
IL_0020: br.s IL_004e |
||||
|
||||
IL_0022: ldarg.0 |
||||
IL_0023: ldc.i4.1 |
||||
IL_0024: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0029: stloc.2 |
||||
IL_002a: ldloc.2 |
||||
IL_002b: brfalse.s IL_0038 |
||||
|
||||
IL_002d: nop |
||||
IL_002e: ldc.i4.1 |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0034: nop |
||||
IL_0035: nop |
||||
IL_0036: br.s IL_004c |
||||
|
||||
IL_0038: ldarg.0 |
||||
IL_0039: ldc.i4.2 |
||||
IL_003a: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003f: stloc.3 |
||||
IL_0040: ldloc.3 |
||||
IL_0041: brfalse.s IL_004c |
||||
|
||||
IL_0043: nop |
||||
IL_0044: ldc.i4.2 |
||||
IL_0045: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_004a: nop |
||||
IL_004b: nop |
||||
IL_004c: br.s IL_005d |
||||
|
||||
IL_004e: ldloc.0 |
||||
IL_004f: ldc.i4.1 |
||||
IL_0050: add |
||||
IL_0051: stloc.0 |
||||
IL_0052: ldloc.0 |
||||
IL_0053: ldc.i4.s 10 |
||||
IL_0055: clt |
||||
IL_0057: stloc.s V_4 |
||||
IL_0059: ldloc.s V_4 |
||||
IL_005b: brtrue.s IL_0005 |
||||
|
||||
IL_005d: ldstr "end" |
||||
IL_0062: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0067: nop |
||||
IL_0068: ret |
||||
} // end of method ReduceNesting::LoopBreakElseIf |
||||
|
||||
.method public hidebysig instance void |
||||
SwitchIf() cil managed |
||||
{ |
||||
// Code size 78 (0x4e) |
||||
.maxstack 2 |
||||
.locals init (int32 V_0, |
||||
bool V_1) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0014 |
||||
|
||||
IL_000c: br.s IL_000e |
||||
|
||||
IL_000e: ldloc.0 |
||||
IL_000f: ldc.i4.1 |
||||
IL_0010: beq.s IL_0021 |
||||
|
||||
IL_0012: br.s IL_002e |
||||
|
||||
IL_0014: ldstr "case 0" |
||||
IL_0019: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_001e: nop |
||||
IL_001f: br.s IL_004d |
||||
|
||||
IL_0021: ldstr "case 1" |
||||
IL_0026: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002b: nop |
||||
IL_002c: br.s IL_004d |
||||
|
||||
IL_002e: ldarg.0 |
||||
IL_002f: ldc.i4.0 |
||||
IL_0030: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0035: stloc.1 |
||||
IL_0036: ldloc.1 |
||||
IL_0037: brfalse.s IL_0042 |
||||
|
||||
IL_0039: nop |
||||
IL_003a: ldc.i4.0 |
||||
IL_003b: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0040: nop |
||||
IL_0041: nop |
||||
IL_0042: ldstr "end" |
||||
IL_0047: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004c: nop |
||||
IL_004d: ret |
||||
} // end of method ReduceNesting::SwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
NestedSwitchIf() cil managed |
||||
{ |
||||
// Code size 95 (0x5f) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1, |
||||
bool V_2) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0051 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldarg.0 |
||||
IL_000e: ldc.i4.0 |
||||
IL_000f: callvirt instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::I(int32) |
||||
IL_0014: stloc.1 |
||||
IL_0015: ldloc.1 |
||||
IL_0016: brfalse.s IL_0020 |
||||
|
||||
IL_0018: br.s IL_001a |
||||
|
||||
IL_001a: ldloc.1 |
||||
IL_001b: ldc.i4.1 |
||||
IL_001c: beq.s IL_002d |
||||
|
||||
IL_001e: br.s IL_003a |
||||
|
||||
IL_0020: ldstr "case 0" |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002a: nop |
||||
IL_002b: br.s IL_005e |
||||
|
||||
IL_002d: ldstr "case 1" |
||||
IL_0032: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0037: nop |
||||
IL_0038: br.s IL_005e |
||||
|
||||
IL_003a: ldarg.0 |
||||
IL_003b: ldc.i4.1 |
||||
IL_003c: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0041: stloc.2 |
||||
IL_0042: ldloc.2 |
||||
IL_0043: brfalse.s IL_004e |
||||
|
||||
IL_0045: nop |
||||
IL_0046: ldc.i4.1 |
||||
IL_0047: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_004c: nop |
||||
IL_004d: nop |
||||
IL_004e: nop |
||||
IL_004f: br.s IL_005e |
||||
|
||||
IL_0051: nop |
||||
IL_0052: ldstr "else" |
||||
IL_0057: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_005c: nop |
||||
IL_005d: nop |
||||
IL_005e: ret |
||||
} // end of method ReduceNesting::NestedSwitchIf |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit1() cil managed |
||||
{ |
||||
// Code size 55 (0x37) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1, |
||||
bool V_2) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: ldc.i4.0 |
||||
IL_0009: ceq |
||||
IL_000b: stloc.0 |
||||
IL_000c: ldloc.0 |
||||
IL_000d: brfalse.s IL_0036 |
||||
|
||||
IL_000f: nop |
||||
IL_0010: ldc.i4.0 |
||||
IL_0011: stloc.1 |
||||
IL_0012: br.s IL_0021 |
||||
|
||||
IL_0014: nop |
||||
IL_0015: ldloc.1 |
||||
IL_0016: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001b: nop |
||||
IL_001c: nop |
||||
IL_001d: ldloc.1 |
||||
IL_001e: ldc.i4.1 |
||||
IL_001f: add |
||||
IL_0020: stloc.1 |
||||
IL_0021: ldloc.1 |
||||
IL_0022: ldc.i4.s 10 |
||||
IL_0024: clt |
||||
IL_0026: stloc.2 |
||||
IL_0027: ldloc.2 |
||||
IL_0028: brtrue.s IL_0014 |
||||
|
||||
IL_002a: ldstr "end" |
||||
IL_002f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0034: nop |
||||
IL_0035: nop |
||||
IL_0036: ret |
||||
} // end of method ReduceNesting::EarlyExit1 |
||||
|
||||
.method public hidebysig instance void |
||||
EarlyExit2() cil managed |
||||
{ |
||||
// Code size 76 (0x4c) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
int32 V_1, |
||||
bool V_2, |
||||
bool V_3) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_000f |
||||
|
||||
IL_000c: nop |
||||
IL_000d: br.s IL_004b |
||||
|
||||
IL_000f: ldc.i4.0 |
||||
IL_0010: stloc.1 |
||||
IL_0011: br.s IL_0037 |
||||
|
||||
IL_0013: nop |
||||
IL_0014: ldloc.1 |
||||
IL_0015: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_001a: nop |
||||
IL_001b: ldloc.1 |
||||
IL_001c: ldc.i4.2 |
||||
IL_001d: rem |
||||
IL_001e: ldc.i4.0 |
||||
IL_001f: ceq |
||||
IL_0021: stloc.2 |
||||
IL_0022: ldloc.2 |
||||
IL_0023: brfalse.s IL_0032 |
||||
|
||||
IL_0025: nop |
||||
IL_0026: ldstr "even" |
||||
IL_002b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0030: nop |
||||
IL_0031: nop |
||||
IL_0032: nop |
||||
IL_0033: ldloc.1 |
||||
IL_0034: ldc.i4.1 |
||||
IL_0035: add |
||||
IL_0036: stloc.1 |
||||
IL_0037: ldloc.1 |
||||
IL_0038: ldc.i4.s 10 |
||||
IL_003a: clt |
||||
IL_003c: stloc.3 |
||||
IL_003d: ldloc.3 |
||||
IL_003e: brtrue.s IL_0013 |
||||
|
||||
IL_0040: ldstr "end" |
||||
IL_0045: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004a: nop |
||||
IL_004b: ret |
||||
} // end of method ReduceNesting::EarlyExit2 |
||||
|
||||
.method public hidebysig instance void |
||||
BalancedIf() cil managed |
||||
{ |
||||
// Code size 81 (0x51) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
bool V_1, |
||||
bool V_2) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_002f |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldstr "true" |
||||
IL_0012: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0017: nop |
||||
IL_0018: ldarg.0 |
||||
IL_0019: ldc.i4.1 |
||||
IL_001a: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_001f: stloc.1 |
||||
IL_0020: ldloc.1 |
||||
IL_0021: brfalse.s IL_002c |
||||
|
||||
IL_0023: nop |
||||
IL_0024: ldc.i4.1 |
||||
IL_0025: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002a: nop |
||||
IL_002b: nop |
||||
IL_002c: nop |
||||
IL_002d: br.s IL_0050 |
||||
|
||||
IL_002f: nop |
||||
IL_0030: ldarg.0 |
||||
IL_0031: ldc.i4.2 |
||||
IL_0032: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0037: stloc.2 |
||||
IL_0038: ldloc.2 |
||||
IL_0039: brfalse.s IL_0044 |
||||
|
||||
IL_003b: nop |
||||
IL_003c: ldc.i4.2 |
||||
IL_003d: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_0042: nop |
||||
IL_0043: nop |
||||
IL_0044: ldstr "false" |
||||
IL_0049: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_004e: nop |
||||
IL_004f: nop |
||||
IL_0050: ret |
||||
} // end of method ReduceNesting::BalancedIf |
||||
|
||||
.method public hidebysig instance string |
||||
ComplexCase1(string s) cil managed |
||||
{ |
||||
// Code size 255 (0xff) |
||||
.maxstack 2 |
||||
.locals init (bool V_0, |
||||
string V_1, |
||||
int32 V_2, |
||||
bool V_3, |
||||
bool V_4, |
||||
int32 V_5, |
||||
bool V_6, |
||||
bool V_7, |
||||
bool V_8, |
||||
bool V_9, |
||||
bool V_10) |
||||
IL_0000: nop |
||||
IL_0001: ldarg.0 |
||||
IL_0002: ldc.i4.0 |
||||
IL_0003: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0008: stloc.0 |
||||
IL_0009: ldloc.0 |
||||
IL_000a: brfalse.s IL_0014 |
||||
|
||||
IL_000c: nop |
||||
IL_000d: ldarg.1 |
||||
IL_000e: stloc.1 |
||||
IL_000f: br IL_00fd |
||||
|
||||
IL_0014: ldc.i4.0 |
||||
IL_0015: stloc.2 |
||||
IL_0016: br IL_00e7 |
||||
|
||||
IL_001b: nop |
||||
IL_001c: ldarg.0 |
||||
IL_001d: ldc.i4.1 |
||||
IL_001e: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_0023: stloc.3 |
||||
IL_0024: ldloc.3 |
||||
IL_0025: brfalse.s IL_0035 |
||||
|
||||
IL_0027: nop |
||||
IL_0028: ldc.i4.1 |
||||
IL_0029: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_002e: nop |
||||
IL_002f: nop |
||||
IL_0030: br IL_00e2 |
||||
|
||||
IL_0035: ldarg.0 |
||||
IL_0036: ldc.i4.2 |
||||
IL_0037: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_003c: stloc.s V_4 |
||||
IL_003e: ldloc.s V_4 |
||||
IL_0040: brfalse.s IL_00a7 |
||||
|
||||
IL_0042: nop |
||||
IL_0043: ldloc.2 |
||||
IL_0044: stloc.s V_5 |
||||
IL_0046: ldloc.s V_5 |
||||
IL_0048: ldc.i4.1 |
||||
IL_0049: beq.s IL_0056 |
||||
|
||||
IL_004b: br.s IL_004d |
||||
|
||||
IL_004d: ldloc.s V_5 |
||||
IL_004f: ldc.i4.2 |
||||
IL_0050: sub |
||||
IL_0051: ldc.i4.1 |
||||
IL_0052: ble.un.s IL_0090 |
||||
|
||||
IL_0054: br.s IL_009d |
||||
|
||||
IL_0056: ldarg.0 |
||||
IL_0057: ldc.i4.3 |
||||
IL_0058: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_005d: stloc.s V_6 |
||||
IL_005f: ldloc.s V_6 |
||||
IL_0061: brfalse.s IL_006d |
||||
|
||||
IL_0063: nop |
||||
IL_0064: ldc.i4.3 |
||||
IL_0065: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_006a: nop |
||||
IL_006b: br.s IL_009d |
||||
|
||||
IL_006d: ldstr "case1" |
||||
IL_0072: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0077: nop |
||||
IL_0078: ldarg.0 |
||||
IL_0079: ldc.i4.4 |
||||
IL_007a: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_007f: stloc.s V_7 |
||||
IL_0081: ldloc.s V_7 |
||||
IL_0083: brfalse.s IL_008e |
||||
|
||||
IL_0085: nop |
||||
IL_0086: ldc.i4.4 |
||||
IL_0087: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_008c: nop |
||||
IL_008d: nop |
||||
IL_008e: br.s IL_009d |
||||
|
||||
IL_0090: ldstr "case23" |
||||
IL_0095: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_009a: nop |
||||
IL_009b: br.s IL_009d |
||||
|
||||
IL_009d: ldc.i4.2 |
||||
IL_009e: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00a3: nop |
||||
IL_00a4: nop |
||||
IL_00a5: br.s IL_00e2 |
||||
|
||||
IL_00a7: ldarg.0 |
||||
IL_00a8: ldc.i4.5 |
||||
IL_00a9: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_00ae: stloc.s V_8 |
||||
IL_00b0: ldloc.s V_8 |
||||
IL_00b2: brfalse.s IL_00bf |
||||
|
||||
IL_00b4: nop |
||||
IL_00b5: ldc.i4.5 |
||||
IL_00b6: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00bb: nop |
||||
IL_00bc: nop |
||||
IL_00bd: br.s IL_00e2 |
||||
|
||||
IL_00bf: nop |
||||
IL_00c0: ldarg.0 |
||||
IL_00c1: ldc.i4.6 |
||||
IL_00c2: callvirt instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting::B(int32) |
||||
IL_00c7: stloc.s V_9 |
||||
IL_00c9: ldloc.s V_9 |
||||
IL_00cb: brfalse.s IL_00d6 |
||||
|
||||
IL_00cd: nop |
||||
IL_00ce: ldc.i4.6 |
||||
IL_00cf: call void [mscorlib]System.Console::WriteLine(int32) |
||||
IL_00d4: nop |
||||
IL_00d5: nop |
||||
IL_00d6: ldstr "else" |
||||
IL_00db: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00e0: nop |
||||
IL_00e1: nop |
||||
IL_00e2: nop |
||||
IL_00e3: ldloc.2 |
||||
IL_00e4: ldc.i4.1 |
||||
IL_00e5: add |
||||
IL_00e6: stloc.2 |
||||
IL_00e7: ldloc.2 |
||||
IL_00e8: ldarg.1 |
||||
IL_00e9: callvirt instance int32 [mscorlib]System.String::get_Length() |
||||
IL_00ee: clt |
||||
IL_00f0: stloc.s V_10 |
||||
IL_00f2: ldloc.s V_10 |
||||
IL_00f4: brtrue IL_001b |
||||
|
||||
IL_00f9: ldarg.1 |
||||
IL_00fa: stloc.1 |
||||
IL_00fb: br.s IL_00fd |
||||
|
||||
IL_00fd: ldloc.1 |
||||
IL_00fe: ret |
||||
} // end of method ReduceNesting::ComplexCase1 |
||||
|
||||
.method family 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 ReduceNesting::.ctor |
||||
|
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.ReduceNesting |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
||||
@ -0,0 +1,339 @@
@@ -0,0 +1,339 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
// software and associated documentation files (the "Software"), to deal in the Software
|
||||
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or
|
||||
// substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
||||
{ |
||||
public class YieldReturnPrettyTest |
||||
{ |
||||
private int fieldOnThis; |
||||
|
||||
public static IEnumerable<char> YieldChars { |
||||
get { |
||||
yield return 'a'; |
||||
yield return 'b'; |
||||
yield return 'c'; |
||||
} |
||||
} |
||||
|
||||
internal static void Print<T>(string name, IEnumerator<T> enumerator) |
||||
{ |
||||
Console.WriteLine(name + ": Test start"); |
||||
while (enumerator.MoveNext()) { |
||||
Console.WriteLine(name + ": " + enumerator.Current); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<string> SimpleYieldReturn() |
||||
{ |
||||
yield return "A"; |
||||
yield return "B"; |
||||
yield return "C"; |
||||
} |
||||
|
||||
public static IEnumerator<string> SimpleYieldReturnEnumerator() |
||||
{ |
||||
yield return "A"; |
||||
yield return "B"; |
||||
yield return "C"; |
||||
} |
||||
|
||||
public IEnumerable<int> YieldReturnParameters(int p) |
||||
{ |
||||
yield return p; |
||||
yield return fieldOnThis; |
||||
} |
||||
|
||||
public IEnumerator<int> YieldReturnParametersEnumerator(int p) |
||||
{ |
||||
yield return p; |
||||
yield return fieldOnThis; |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldReturnInLoop() |
||||
{ |
||||
for (int i = 0; i < 100; i++) { |
||||
yield return i; |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldReturnWithTryFinally() |
||||
{ |
||||
yield return 0; |
||||
try { |
||||
yield return 1; |
||||
} finally { |
||||
Console.WriteLine("Finally!"); |
||||
} |
||||
yield return 2; |
||||
} |
||||
|
||||
#if TODO
|
||||
// TODO: adjust lock-pattern for this case
|
||||
public static IEnumerable<int> YieldReturnInLock1(object o) |
||||
{ |
||||
lock (o) { |
||||
yield return 1; |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldReturnInLock2(object o) |
||||
{ |
||||
lock (o) { |
||||
yield return 1; |
||||
o = null; |
||||
yield return 2; |
||||
} |
||||
} |
||||
#endif
|
||||
|
||||
public static IEnumerable<string> YieldReturnWithNestedTryFinally(bool breakInMiddle) |
||||
{ |
||||
Console.WriteLine("Start of method - 1"); |
||||
yield return "Start of method"; |
||||
Console.WriteLine("Start of method - 2"); |
||||
try { |
||||
Console.WriteLine("Within outer try - 1"); |
||||
yield return "Within outer try"; |
||||
Console.WriteLine("Within outer try - 2"); |
||||
try { |
||||
Console.WriteLine("Within inner try - 1"); |
||||
yield return "Within inner try"; |
||||
Console.WriteLine("Within inner try - 2"); |
||||
if (breakInMiddle) { |
||||
Console.WriteLine("Breaking..."); |
||||
yield break; |
||||
} |
||||
Console.WriteLine("End of inner try - 1"); |
||||
yield return "End of inner try"; |
||||
Console.WriteLine("End of inner try - 2"); |
||||
} finally { |
||||
Console.WriteLine("Inner Finally"); |
||||
} |
||||
Console.WriteLine("End of outer try - 1"); |
||||
yield return "End of outer try"; |
||||
Console.WriteLine("End of outer try - 2"); |
||||
} finally { |
||||
Console.WriteLine("Outer Finally"); |
||||
} |
||||
Console.WriteLine("End of method - 1"); |
||||
yield return "End of method"; |
||||
Console.WriteLine("End of method - 2"); |
||||
} |
||||
|
||||
public static IEnumerable<string> YieldReturnWithTwoNonNestedFinallyBlocks(IEnumerable<string> input) |
||||
{ |
||||
// outer try-finally block
|
||||
foreach (string line in input) { |
||||
// nested try-finally block
|
||||
try { |
||||
yield return line; |
||||
} finally { |
||||
Console.WriteLine("Processed " + line); |
||||
} |
||||
} |
||||
yield return "A"; |
||||
yield return "B"; |
||||
yield return "C"; |
||||
yield return "D"; |
||||
yield return "E"; |
||||
yield return "F"; |
||||
// outer try-finally block
|
||||
foreach (string item in input) { |
||||
yield return item.ToUpper(); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<Func<string>> YieldReturnWithAnonymousMethods1(IEnumerable<string> input) |
||||
{ |
||||
foreach (string line in input) { |
||||
yield return () => line; |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<Func<string>> YieldReturnWithAnonymousMethods2(IEnumerable<string> input) |
||||
{ |
||||
foreach (string item in input) { |
||||
string copy = item; |
||||
yield return () => copy; |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> GetEvenNumbers(int n) |
||||
{ |
||||
for (int i = 0; i < n; i++) { |
||||
if (i % 2 == 0) { |
||||
yield return i; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<char> ExceptionHandling() |
||||
{ |
||||
yield return 'a'; |
||||
try { |
||||
Console.WriteLine("1 - try"); |
||||
} catch (Exception) { |
||||
Console.WriteLine("1 - catch"); |
||||
} |
||||
yield return 'b'; |
||||
try { |
||||
try { |
||||
Console.WriteLine("2 - try"); |
||||
} finally { |
||||
Console.WriteLine("2 - finally"); |
||||
} |
||||
yield return 'c'; |
||||
} finally { |
||||
Console.WriteLine("outer finally"); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldBreakInCatch() |
||||
{ |
||||
yield return 0; |
||||
try { |
||||
Console.WriteLine("In Try"); |
||||
} catch { |
||||
// yield return is not allowed in catch, but yield break is
|
||||
yield break; |
||||
} |
||||
yield return 1; |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldBreakInCatchInTryFinally() |
||||
{ |
||||
try { |
||||
yield return 0; |
||||
try { |
||||
Console.WriteLine("In Try"); |
||||
} catch { |
||||
// yield return is not allowed in catch, but yield break is
|
||||
// Note that pre-roslyn, this code triggers a compiler bug:
|
||||
// If the finally block throws an exception, it ends up getting
|
||||
// called a second time.
|
||||
yield break; |
||||
} |
||||
yield return 1; |
||||
} finally { |
||||
Console.WriteLine("Finally"); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldBreakInTryCatchInTryFinally() |
||||
{ |
||||
try { |
||||
yield return 0; |
||||
try { |
||||
Console.WriteLine("In Try"); |
||||
// same compiler bug as in YieldBreakInCatchInTryFinally
|
||||
yield break; |
||||
} catch { |
||||
Console.WriteLine("Catch"); |
||||
} |
||||
yield return 1; |
||||
} finally { |
||||
Console.WriteLine("Finally"); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldBreakInTryFinallyInTryFinally(bool b) |
||||
{ |
||||
try { |
||||
yield return 0; |
||||
try { |
||||
Console.WriteLine("In Try"); |
||||
if (b) { |
||||
// same compiler bug as in YieldBreakInCatchInTryFinally
|
||||
yield break; |
||||
} |
||||
} finally { |
||||
Console.WriteLine("Inner Finally"); |
||||
} |
||||
yield return 1; |
||||
} finally { |
||||
Console.WriteLine("Finally"); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> YieldBreakOnly() |
||||
{ |
||||
yield break; |
||||
} |
||||
|
||||
public static IEnumerable<int> UnconditionalThrowInTryFinally() |
||||
{ |
||||
// Here, MoveNext() doesn't call the finally methods at all
|
||||
// (only indirectly via Dispose())
|
||||
try { |
||||
yield return 0; |
||||
throw new NotImplementedException(); |
||||
} finally { |
||||
Console.WriteLine("Finally"); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> NestedTryFinallyStartingOnSamePosition() |
||||
{ |
||||
// The first user IL instruction is already in 2 nested try blocks.
|
||||
try { |
||||
try { |
||||
yield return 0; |
||||
} finally { |
||||
Console.WriteLine("Inner Finally"); |
||||
} |
||||
} finally { |
||||
Console.WriteLine("Outer Finally"); |
||||
} |
||||
} |
||||
|
||||
public static IEnumerable<int> LocalInFinally<T>(T a) where T : IDisposable |
||||
{ |
||||
yield return 1; |
||||
try { |
||||
yield return 2; |
||||
} finally { |
||||
T val = a; |
||||
val.Dispose(); |
||||
val.Dispose(); |
||||
} |
||||
yield return 3; |
||||
} |
||||
|
||||
public static IEnumerable<T> GenericYield<T>() where T : new() |
||||
{ |
||||
T val = new T(); |
||||
for (int i = 0; i < 3; i++) { |
||||
yield return val; |
||||
} |
||||
} |
||||
} |
||||
|
||||
internal struct StructWithYieldReturn |
||||
{ |
||||
private int val; |
||||
|
||||
public IEnumerable<int> Count() |
||||
{ |
||||
yield return val++; |
||||
yield return val++; |
||||
} |
||||
} |
||||
} |
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,418 @@
@@ -0,0 +1,418 @@
|
||||
// Copyright (c) 2018 Siegfried Pammer
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
// software and associated documentation files (the "Software"), to deal in the Software
|
||||
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||
// to whom the Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all copies or
|
||||
// substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
using System; |
||||
using System.Diagnostics; |
||||
using System.Linq; |
||||
using ICSharpCode.Decompiler.IL.ControlFlow; |
||||
using ICSharpCode.Decompiler.IL.Transforms; |
||||
using ICSharpCode.Decompiler.Util; |
||||
|
||||
namespace ICSharpCode.Decompiler.IL |
||||
{ |
||||
/// <summary>
|
||||
/// Improves code quality by duplicating keyword exits to reduce nesting and restoring IL order.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// ConditionDetection and DetectSwitchBody both have agressive inlining policies for else blocks and default cases respectively.
|
||||
/// This can lead to excessive indentation when the entire rest of the method/loop is included in the else block/default case.
|
||||
/// When an If/SwitchInstruction is followed immediately by a keyword exit, the exit can be moved into the child blocks
|
||||
/// allowing the else block or default case to be moved after the if/switch as all prior cases exit.
|
||||
/// Most importantly, this transformatino does not change the IL order of any code.
|
||||
///
|
||||
/// ConditionDetection also has a block exit priority system to assist exit point reduction which in some cases ignores IL order.
|
||||
/// After HighLevelLoopTransform has run, all structures have been detected and preference can be returned to maintaining IL ordering.
|
||||
/// </remarks>
|
||||
public class ReduceNestingTransform : IILTransform |
||||
{ |
||||
private ILTransformContext context; |
||||
|
||||
public void Run(ILFunction function, ILTransformContext context) |
||||
{ |
||||
this.context = context; |
||||
Visit((BlockContainer)function.Body, null); |
||||
} |
||||
|
||||
private void Visit(BlockContainer container, Block continueTarget) |
||||
{ |
||||
switch (container.Kind) { |
||||
case ContainerKind.Loop: |
||||
case ContainerKind.While: |
||||
continueTarget = container.EntryPoint; |
||||
break; |
||||
case ContainerKind.DoWhile: |
||||
case ContainerKind.For: |
||||
continueTarget = container.Blocks.Last(); |
||||
break; |
||||
} |
||||
|
||||
foreach (var block in container.Blocks) |
||||
Visit(block, continueTarget); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Visits a block in context
|
||||
/// </summary>
|
||||
/// <param name="block"></param>
|
||||
/// <param name="continueTarget">Marks the target block of continue statements.</param>
|
||||
/// <param name="nextInstruction">The instruction following the end point of the block. Can only be null if the end point is unreachable.</param>
|
||||
private void Visit(Block block, Block continueTarget, ILInstruction nextInstruction = null) |
||||
{ |
||||
Debug.Assert(block.HasFlag(InstructionFlags.EndPointUnreachable) || nextInstruction != null); |
||||
|
||||
// process each instruction in the block.
|
||||
for (int i = 0; i < block.Instructions.Count; i++) { |
||||
// Transformations may be applied to the current and following instructions but already processed instructions will not be changed
|
||||
var inst = block.Instructions[i]; |
||||
|
||||
// the next instruction to be executed. Transformations will change the next instruction, so this is a method instead of a variable
|
||||
ILInstruction NextInsn() => i + 1 < block.Instructions.Count ? block.Instructions[i + 1] : nextInstruction; |
||||
|
||||
switch (inst) { |
||||
case BlockContainer container: |
||||
// visit the contents of the container
|
||||
Visit(container, continueTarget); |
||||
|
||||
// reduce nesting in switch blocks
|
||||
if (container.Kind == ContainerKind.Switch && |
||||
CanDuplicateExit(NextInsn(), continueTarget) && |
||||
ReduceNesting(block, container, NextInsn())) |
||||
RemoveRedundantExit(block, nextInstruction); |
||||
|
||||
break; |
||||
case IfInstruction ifInst: |
||||
ImproveILOrdering(block, ifInst); |
||||
|
||||
// reduce nesting in if/else blocks
|
||||
if (CanDuplicateExit(NextInsn(), continueTarget) && ReduceNesting(block, ifInst, NextInsn())) |
||||
RemoveRedundantExit(block, nextInstruction); |
||||
|
||||
// visit content blocks
|
||||
if (ifInst.TrueInst is Block trueBlock) |
||||
Visit(trueBlock, continueTarget, NextInsn()); |
||||
|
||||
if (ifInst.FalseInst is Block falseBlock) { |
||||
if (ifInst.TrueInst.HasFlag(InstructionFlags.EndPointUnreachable)) { |
||||
ExtractElseBlock(ifInst); |
||||
break; |
||||
} |
||||
|
||||
Visit(falseBlock, continueTarget, NextInsn()); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// For an if statement with an unreachable end point and no else block,
|
||||
/// inverts to match IL order of the first statement of each branch
|
||||
/// </summary>
|
||||
private void ImproveILOrdering(Block block, IfInstruction ifInst) |
||||
{ |
||||
if (!block.HasFlag(InstructionFlags.EndPointUnreachable) |
||||
|| !ifInst.TrueInst.HasFlag(InstructionFlags.EndPointUnreachable) |
||||
|| !ifInst.FalseInst.MatchNop()) |
||||
return; |
||||
|
||||
Debug.Assert(ifInst != block.Instructions.Last()); |
||||
|
||||
var trueRange = ConditionDetection.GetILRange(ifInst.TrueInst); |
||||
var falseRange = ConditionDetection.GetILRange(block.Instructions[block.Instructions.IndexOf(ifInst)+1]); |
||||
if (!trueRange.IsEmpty && !falseRange.IsEmpty && falseRange.Start < trueRange.Start) |
||||
ConditionDetection.InvertIf(block, ifInst, context); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Reduce Nesting in if/else statements by duplicating an exit instruction.
|
||||
/// Does not affect IL order
|
||||
/// </summary>
|
||||
private bool ReduceNesting(Block block, IfInstruction ifInst, ILInstruction exitInst) |
||||
{ |
||||
// start tallying stats for heuristics from then and else-if blocks
|
||||
int maxStatements = 0, maxDepth = 0; |
||||
UpdateStats(ifInst.TrueInst, ref maxStatements, ref maxDepth); |
||||
|
||||
// if (cond) { ... } exit;
|
||||
if (ifInst.FalseInst.MatchNop()) { |
||||
// a separate heuristic tp ShouldReduceNesting as there is visual balancing to be performed based on number of statments
|
||||
if (maxDepth < 2) |
||||
return false; |
||||
|
||||
// ->
|
||||
// if (!cond) exit;
|
||||
// ...; exit;
|
||||
EnsureEndPointUnreachable(ifInst.TrueInst, exitInst); |
||||
EnsureEndPointUnreachable(block, exitInst); |
||||
ConditionDetection.InvertIf(block, ifInst, context); |
||||
return true; |
||||
} |
||||
|
||||
// else-if trees are considered as a single group from the root IfInstruction
|
||||
if (GetElseIfParent(ifInst) != null) |
||||
return false; |
||||
|
||||
// find the else block and tally stats for each else-if block
|
||||
while (Block.Unwrap(ifInst.FalseInst) is IfInstruction elseIfInst) { |
||||
UpdateStats(elseIfInst.TrueInst, ref maxStatements, ref maxDepth); |
||||
ifInst = elseIfInst; |
||||
} |
||||
|
||||
if (!ShouldReduceNesting(ifInst.FalseInst, maxStatements, maxDepth)) |
||||
return false; |
||||
|
||||
// extract the else block and insert exit points all the way up the else-if tree
|
||||
do { |
||||
var elseIfInst = GetElseIfParent(ifInst); |
||||
|
||||
// if (cond) { ... } else { ... } exit;
|
||||
// ->
|
||||
// if (cond) { ...; exit; }
|
||||
// ...; exit;
|
||||
EnsureEndPointUnreachable(ifInst.TrueInst, exitInst); |
||||
ExtractElseBlock(ifInst); |
||||
ifInst = elseIfInst; |
||||
} while (ifInst != null); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Reduce Nesting in switch statements by replacing break; in cases with the block exit, and extracting the default case
|
||||
/// Does not affect IL order
|
||||
/// </summary>
|
||||
private bool ReduceNesting(Block parentBlock, BlockContainer switchContainer, ILInstruction exitInst) |
||||
{ |
||||
// break; from outer container cannot be brought inside the switch as the meaning would change
|
||||
if (exitInst is Leave leave && !leave.IsLeavingFunction) |
||||
return false; |
||||
|
||||
// find the default section, and ensure it has only one incoming edge
|
||||
var switchInst = (SwitchInstruction)switchContainer.EntryPoint.Instructions.Single(); |
||||
var defaultSection = switchInst.Sections.MaxBy(s => s.Labels.Count()); |
||||
if (!defaultSection.Body.MatchBranch(out var defaultBlock) || defaultBlock.IncomingEdgeCount != 1) |
||||
return false; |
||||
|
||||
// tally stats for heuristic from each case block
|
||||
int maxStatements = 0, maxDepth = 0; |
||||
foreach (var section in switchInst.Sections) |
||||
if (section != defaultSection && section.Body.MatchBranch(out var caseBlock) && caseBlock.Parent == switchContainer) |
||||
UpdateStats(caseBlock, ref maxStatements, ref maxDepth); |
||||
|
||||
if (!ShouldReduceNesting(defaultBlock, maxStatements, maxDepth)) |
||||
return false; |
||||
|
||||
Debug.Assert(defaultBlock.HasFlag(InstructionFlags.EndPointUnreachable)); |
||||
|
||||
// ensure the default case dominator tree has no exits (branches to other cases)
|
||||
var cfg = new ControlFlowGraph(switchContainer, context.CancellationToken); |
||||
var defaultNode = cfg.GetNode(defaultBlock); |
||||
var defaultTree = TreeTraversal.PreOrder(defaultNode, n => n.DominatorTreeChildren).ToList(); |
||||
if (defaultTree.SelectMany(n => n.Successors).Any(n => !defaultNode.Dominates(n))) |
||||
return false; |
||||
|
||||
EnsureEndPointUnreachable(parentBlock, exitInst); |
||||
context.Step("Extract default case of switch", switchContainer); |
||||
|
||||
// replace all break; statements with the exitInst
|
||||
var leaveInstructions = switchContainer.Descendants.Where(inst => inst.MatchLeave(switchContainer)); |
||||
foreach (var leaveInst in leaveInstructions.ToArray()) |
||||
leaveInst.ReplaceWith(exitInst.Clone()); |
||||
|
||||
// replace the default section branch with a break;
|
||||
defaultSection.Body.ReplaceWith(new Leave(switchContainer)); |
||||
|
||||
// remove all default blocks from the switch container
|
||||
var defaultBlocks = defaultTree.Select(c => (Block)c.UserData).ToList(); |
||||
foreach (var block in defaultBlocks) |
||||
switchContainer.Blocks.Remove(block); |
||||
|
||||
// replace the parent block exit with the default case instructions
|
||||
parentBlock.Instructions.RemoveLast(); |
||||
parentBlock.Instructions.AddRange(defaultBlock.Instructions); |
||||
|
||||
// add any additional blocks from the default case to the parent container
|
||||
var parentContainer = (BlockContainer)parentBlock.Ancestors.First(p => p is BlockContainer); |
||||
int insertAt = parentContainer.Blocks.IndexOf(parentBlock) + 1; |
||||
foreach (var block in defaultBlocks.Skip(1)) |
||||
parentContainer.Blocks.Insert(insertAt++, block); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Checks if an exit is a duplicable keyword exit (return; break; continue;)
|
||||
/// </summary>
|
||||
private bool CanDuplicateExit(ILInstruction exit, Block continueTarget) => |
||||
exit != null && (exit is Leave leave && leave.Value.MatchNop() || exit.MatchBranch(continueTarget)); |
||||
|
||||
/// <summary>
|
||||
/// Ensures the end point of a block is unreachable by duplicating and appending the [exit] instruction following the end point
|
||||
/// </summary>
|
||||
/// <param name="inst">The instruction/block of interest</param>
|
||||
/// <param name="fallthroughExit">The next instruction to be executed (provided inst does not exit)</param>
|
||||
private void EnsureEndPointUnreachable(ILInstruction inst, ILInstruction fallthroughExit) |
||||
{ |
||||
if (!(inst is Block block)) { |
||||
Debug.Assert(inst.HasFlag(InstructionFlags.EndPointUnreachable)); |
||||
return; |
||||
} |
||||
|
||||
if (!block.HasFlag(InstructionFlags.EndPointUnreachable)) { |
||||
context.Step("Duplicate block exit", fallthroughExit); |
||||
block.Instructions.Add(fallthroughExit.Clone()); |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Removes a redundant block exit instruction.
|
||||
/// </summary>
|
||||
private void RemoveRedundantExit(Block block, ILInstruction implicitExit) |
||||
{ |
||||
if (block.Instructions.Last().Match(implicitExit).Success) { |
||||
context.Step("Remove redundant exit", block.Instructions.Last()); |
||||
block.Instructions.RemoveLast(); |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Determines if an IfInstruction is an else-if and returns the preceeding (parent) IfInstruction
|
||||
///
|
||||
/// [else-]if (parent-cond) else { ifInst }
|
||||
/// </summary>
|
||||
private IfInstruction GetElseIfParent(IfInstruction ifInst) |
||||
{ |
||||
Debug.Assert(ifInst.Parent is Block); |
||||
if (Block.Unwrap(ifInst.Parent) == ifInst && // only instruction in block
|
||||
ifInst.Parent.Parent is IfInstruction elseIfInst && // parent of block is an IfInstruction
|
||||
elseIfInst.FalseInst == ifInst.Parent) // part of the false branch not the true branch
|
||||
return elseIfInst; |
||||
|
||||
return null; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Adds a code path to the current heuristic tally
|
||||
/// </summary>
|
||||
private void UpdateStats(ILInstruction inst, ref int maxStatements, ref int maxDepth) |
||||
{ |
||||
int numStatements = 0; |
||||
ComputeStats(inst, ref numStatements, ref maxDepth, 0); |
||||
maxStatements = Math.Max(numStatements, maxStatements); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Recursively computes the number of statements and maximum nested depth of an instruction
|
||||
/// </summary>
|
||||
private void ComputeStats(ILInstruction inst, ref int numStatements, ref int maxDepth, int currentDepth) |
||||
{ |
||||
switch (inst) { |
||||
case Block block: |
||||
foreach (var i in block.Instructions) |
||||
ComputeStats(i, ref numStatements, ref maxDepth, currentDepth); |
||||
break; |
||||
case BlockContainer container: |
||||
numStatements++; // one statement for the container head (switch/loop)
|
||||
|
||||
var containerBody = container.EntryPoint; |
||||
if (container.Kind == ContainerKind.For || container.Kind == ContainerKind.While) { |
||||
if (!container.MatchConditionBlock(container.EntryPoint, out _, out containerBody)) |
||||
throw new NotSupportedException("Invalid condition block in loop."); |
||||
} |
||||
|
||||
// add the nested body
|
||||
ComputeStats(containerBody, ref numStatements, ref maxDepth, currentDepth + 1); |
||||
break; |
||||
case IfInstruction ifInst: |
||||
numStatements++; // one statement for the if/condition itself
|
||||
|
||||
// nested then instruction
|
||||
ComputeStats(ifInst.TrueInst, ref numStatements, ref maxDepth, currentDepth + 1); |
||||
|
||||
// include all nested else-if instructions at the same depth
|
||||
var elseInst = ifInst.FalseInst; |
||||
while (Block.Unwrap(elseInst) is IfInstruction elseIfInst) { |
||||
numStatements++; |
||||
ComputeStats(elseIfInst.TrueInst, ref numStatements, ref maxDepth, currentDepth + 1); |
||||
elseInst = elseIfInst.FalseInst; |
||||
} |
||||
|
||||
// include all nested else instruction
|
||||
ComputeStats(elseInst, ref numStatements, ref maxDepth, currentDepth + 1); |
||||
break; |
||||
case SwitchInstruction switchInst: |
||||
// one statement per case label
|
||||
numStatements += switchInst.Sections.Count + 1; |
||||
// add all the case blocks at the current depth
|
||||
// most formatters indent switch blocks twice, but we don't want this heuristic to be based on formatting
|
||||
// so we remain conservative and only include the increase in depth from the container and not the labels
|
||||
foreach (var section in switchInst.Sections) |
||||
if (section.Body.MatchBranch(out var caseBlock) && caseBlock.Parent == switchInst.Parent.Parent) |
||||
ComputeStats(caseBlock, ref numStatements, ref maxDepth, currentDepth); |
||||
break; |
||||
default: |
||||
// just a regular statement
|
||||
numStatements++; |
||||
if (currentDepth > maxDepth) |
||||
maxDepth = currentDepth; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Heuristic to determine whether it is worth duplicating exits into the preceeding sibling blocks (then/else-if/case)
|
||||
/// in order to reduce the nesting of inst by 1
|
||||
/// </summary>
|
||||
/// <param name="inst">The instruction heading the nested candidate block</param>
|
||||
/// <param name="maxStatements">The number of statements in the largest sibling block</param>
|
||||
/// <param name="maxDepth">The relative depth of the most nested statement in the sibling blocks</param>
|
||||
/// <returns></returns>
|
||||
private bool ShouldReduceNesting(ILInstruction inst, int maxStatements, int maxDepth) |
||||
{ |
||||
int maxStatements2 = 0, maxDepth2 = 0; |
||||
UpdateStats(inst, ref maxStatements2, ref maxDepth2); |
||||
// if the max depth is 2, always reduce nesting (total depth 3 or more)
|
||||
// if the max depth is 1, reduce nesting if this block is the largest
|
||||
// otherwise reduce nesting only if this block is twice as large as any other
|
||||
return maxDepth2 >= 2 || maxDepth2 >= 1 && maxStatements2 > maxStatements || maxStatements2 >= 2*maxStatements; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// if (cond) { ...; exit; } else { ... }
|
||||
/// ...;
|
||||
/// ->
|
||||
/// if (cond) { ...; exit; }
|
||||
/// ...;
|
||||
/// ...;
|
||||
/// </summary>
|
||||
/// <param name="ifInst"></param>
|
||||
private void ExtractElseBlock(IfInstruction ifInst) |
||||
{ |
||||
Debug.Assert(ifInst.TrueInst.HasFlag(InstructionFlags.EndPointUnreachable)); |
||||
var block = (Block)ifInst.Parent; |
||||
var falseBlock = (Block)ifInst.FalseInst; |
||||
|
||||
context.Step("Extract else block", ifInst); |
||||
int insertAt = block.Instructions.IndexOf(ifInst) + 1; |
||||
for (int i = 0; i < falseBlock.Instructions.Count; i++) |
||||
block.Instructions.Insert(insertAt++, falseBlock.Instructions[i]); |
||||
|
||||
ifInst.FalseInst = new Nop(); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,112 @@
@@ -0,0 +1,112 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Text; |
||||
using System.Threading.Tasks; |
||||
|
||||
namespace ICSharpCode.ILSpy.AddIn |
||||
{ |
||||
class ILSpyParameters |
||||
{ |
||||
public ILSpyParameters(IEnumerable<string> assemblyFileNames, params string[] arguments) |
||||
{ |
||||
this.AssemblyFileNames = assemblyFileNames; |
||||
this.Arguments = arguments; |
||||
} |
||||
|
||||
public IEnumerable<string> AssemblyFileNames { get; private set; } |
||||
public string[] Arguments { get; private set; } |
||||
} |
||||
|
||||
class ILSpyInstance |
||||
{ |
||||
ILSpyParameters parameters; |
||||
|
||||
public ILSpyInstance() |
||||
{ |
||||
} |
||||
|
||||
public ILSpyInstance(ILSpyParameters parameters) |
||||
{ |
||||
this.parameters = parameters; |
||||
} |
||||
|
||||
static string GetILSpyPath() |
||||
{ |
||||
var basePath = Path.GetDirectoryName(typeof(ILSpyAddInPackage).Assembly.Location); |
||||
return Path.Combine(basePath, "ILSpy.exe"); |
||||
} |
||||
|
||||
public void Start() |
||||
{ |
||||
var commandLineArguments = parameters.AssemblyFileNames?.Concat(parameters.Arguments); |
||||
|
||||
var process = new Process() { |
||||
StartInfo = new ProcessStartInfo() { |
||||
FileName = GetILSpyPath(), |
||||
UseShellExecute = false |
||||
} |
||||
}; |
||||
process.Start(); |
||||
|
||||
if ((commandLineArguments != null) && commandLineArguments.Any()) { |
||||
// Only need a message to started process if there are any parameters to pass
|
||||
SendMessage(process, "ILSpy:\r\n" + string.Join(Environment.NewLine, commandLineArguments), true); |
||||
} |
||||
} |
||||
|
||||
void SendMessage(Process ilspyProcess, string message, bool activate) |
||||
{ |
||||
// We wait asynchronously until target window can be found and try to find it multiple times
|
||||
Task.Run(async () => { |
||||
bool success = false; |
||||
int remainingAttempts = 20; |
||||
do { |
||||
NativeMethods.EnumWindows( |
||||
(hWnd, lParam) => { |
||||
string windowTitle = NativeMethods.GetWindowText(hWnd, 100); |
||||
if (windowTitle.StartsWith("ILSpy", StringComparison.Ordinal)) { |
||||
Debug.WriteLine("Found {0:x4}: {1}", hWnd, windowTitle); |
||||
IntPtr result = Send(hWnd, message); |
||||
Debug.WriteLine("WM_COPYDATA result: {0:x8}", result); |
||||
if (result == (IntPtr)1) { |
||||
if (activate) |
||||
NativeMethods.SetForegroundWindow(hWnd); |
||||
success = true; |
||||
return false; // stop enumeration
|
||||
} |
||||
} |
||||
return true; // continue enumeration
|
||||
}, IntPtr.Zero); |
||||
|
||||
// Wait some time before next attempt
|
||||
await Task.Delay(500); |
||||
remainingAttempts--; |
||||
} while (!success && (remainingAttempts > 0)); |
||||
}); |
||||
} |
||||
|
||||
unsafe static IntPtr Send(IntPtr hWnd, string message) |
||||
{ |
||||
const uint SMTO_NORMAL = 0; |
||||
|
||||
CopyDataStruct lParam; |
||||
lParam.Padding = IntPtr.Zero; |
||||
lParam.Size = message.Length * 2; |
||||
fixed (char* buffer = message) { |
||||
lParam.Buffer = (IntPtr)buffer; |
||||
IntPtr result; |
||||
// SendMessage with 3s timeout (e.g. when the target process is stopped in the debugger)
|
||||
if (NativeMethods.SendMessageTimeout( |
||||
hWnd, NativeMethods.WM_COPYDATA, IntPtr.Zero, ref lParam, |
||||
SMTO_NORMAL, 3000, out result) != IntPtr.Zero) { |
||||
return result; |
||||
} else { |
||||
return IntPtr.Zero; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue