Keith, In fact, the algorithm is not supposed to check all possible paths:
1. As you said, any "No self-respecting compiler would produce such code." 2. We are not developing a PEVerify-like tool. 3. We need to keep the ComputeMaxStack method as simple as possible. Handling all these cases would add a lot of complexity to the code. 4. We need to keep performance issues in mind... I agree with you about the fact that if there is a conflict detected, we probably should throw an exception. Or we can just use a very large stack size (like methodBody.MaxStack = 100) Daniel, For dead code, we cannot just remove it ! But we still have to visit "dead code" in a top-down fashion (and we should assume that it starts with a 0 stack depth, because this is how Mono would validate the stack depth). Have a look at the following code : L0: ldc.i4.1 L1: br.s L6 L2: ldc.i4.2 L3: ldc.i4.3 L4: add L5: br.s L7 L6: br.s L3 L7: stloc.0 L8: ... This code is 100% valid, it has 1 single dead instruction at L2. If you remove this instruction, your code would be no longer valid !!!! In fact this is a very good feature that I'm willing to use in my obfuscator to produce 100% valid code than would have been decompiled : int i = 2 + 3; instead of int i = 1 + 3; All decompilers would crash or produce bad code. --~--~---------~--~----~------------~-------~--~----~ -- mono-cecil -~----------~----~----~----~------~----~------~--~---
