private void DetachFromLogicalTree(CFGBlockLogicalConstruct node) { if (node.get_CFGPredecessors().get_Count() > 0 || node.get_CFGSuccessors().get_Count() > 0) { throw new Exception("This node cannot be detached from the logical tree."); } dummyVar0 = node.get_Parent().get_Children().Remove(node); V_0 = this.logicalContext.get_CFGBlockToLogicalConstructMap().get_Item(node.get_TheBlock()); if ((int)V_0.Length == 1) { if (V_0[0] != node) { throw new Exception("Logical tree is inconsistent."); } dummyVar1 = this.logicalContext.get_CFGBlockToLogicalConstructMap().Remove(node.get_TheBlock()); } V_1 = new CFGBlockLogicalConstruct[(int)V_0.Length - 1]; V_2 = 0; V_3 = 0; while (V_2 < (int)V_0.Length) { if (V_0[V_2] != node) { if (V_3 == (int)V_0.Length) { throw new Exception("Logical tree is inconsistent."); } V_1[V_3] = V_0[V_2]; } else { V_3 = V_3 - 1; } V_2 = V_2 + 1; V_3 = V_3 + 1; } this.logicalContext.get_CFGBlockToLogicalConstructMap().set_Item(node.get_TheBlock(), V_1); return; }
private CFGBlockLogicalConstruct ProcessFinallyNode(CFGBlockLogicalConstruct finallyBlockEntry, CFGBlockLogicalConstruct finallyBlockEnd) { V_1 = finallyBlockEntry.get_SameParentPredecessors().GetEnumerator(); try { while (V_1.MoveNext()) { V_2 = (ILogicalConstruct)V_1.get_Current(); if (this.newTryBody.Contains(V_2)) { continue; } throw new Exception("Invalid entry to the finally block"); } } finally { ((IDisposable)V_1).Dispose(); } V_3 = finallyBlockEnd.get_CFGSuccessors().GetEnumerator(); try { dummyVar0 = V_3.MoveNext(); V_0 = V_3.get_Current(); if (V_3.MoveNext()) { throw new Exception("Invalid count of successors"); } } finally { if (V_3 != null) { V_3.Dispose(); } } V_4 = (new HashSet <CFGBlockLogicalConstruct>(finallyBlockEntry.get_CFGPredecessors())).GetEnumerator(); try { while (V_4.MoveNext()) { V_5 = V_4.get_Current(); if (InstructionBlock.op_Inequality(V_5.get_TheBlock(), finallyBlockEntry.get_TheBlock()) && (int)V_5.get_TheBlock().get_Successors().Length > 1) { this.ProcessMultiWayCFGPredecessor(finallyBlockEntry, V_5.get_TheBlock(), V_0.get_TheBlock()); } V_6 = V_5; while (V_6 != finallyBlockEntry.get_Parent()) { dummyVar1 = V_6.RemoveFromSuccessors(finallyBlockEntry); V_6.AddToSuccessors(V_0); V_6 = V_6.get_Parent() as LogicalConstructBase; } V_0.AddToPredecessors(V_5); dummyVar2 = finallyBlockEntry.RemoveFromPredecessors(V_5); } } finally { ((IDisposable)V_4).Dispose(); } dummyVar3 = V_0.RemoveFromPredecessors(finallyBlockEnd); dummyVar4 = finallyBlockEnd.RemoveFromSuccessors(V_0); return(V_0); }