/// <summary> /// Creates simple conditions containing only one CFG construct (may be partial). /// </summary> private void CreateSimpleConditions() { //Since we've split the CFG constructs in the CFGBlockSplitter, we now know that if an instruction block is a condition block, //the last of the (partial) CFG constructs holds the condition expression. //The only thing left to check is if the block is not a switch block, since switch blocks are a special case and are not proccessed as //normal conditions. foreach (CFGBlockLogicalConstruct[] cfgConstructsArray in logicalBuilderContext.CFGBlockToLogicalConstructMap.Values) { CFGBlockLogicalConstruct cfgConstruct = cfgConstructsArray[cfgConstructsArray.Length - 1]; InstructionBlock theInstructionBlock = cfgConstruct.TheBlock; if (theInstructionBlock.Successors.Length == 2 && theInstructionBlock.Successors[0] != theInstructionBlock.Successors[1] && theInstructionBlock.Last.OpCode.Code != Code.Switch) { ConditionLogicalConstruct.GroupInSimpleConditionConstruct(cfgConstruct); } } }
private void CreateSimpleConditions() { V_0 = this.logicalBuilderContext.get_CFGBlockToLogicalConstructMap().get_Values().GetEnumerator(); try { while (V_0.MoveNext()) { stackVariable8 = V_0.get_Current(); V_1 = stackVariable8[(int)stackVariable8.Length - 1]; V_2 = V_1.get_TheBlock(); if ((int)V_2.get_Successors().Length != 2 || !InstructionBlock.op_Inequality(V_2.get_Successors()[0], V_2.get_Successors()[1]) || V_2.get_Last().get_OpCode().get_Code() == 68) { continue; } dummyVar0 = ConditionLogicalConstruct.GroupInSimpleConditionConstruct(V_1); } } finally { ((IDisposable)V_0).Dispose(); } return; }