private void ProcessLogicalConstruct(ILogicalConstruct theConstruct) { if (theConstruct as BlockLogicalConstruct == null) { if (theConstruct as ExceptionHandlingLogicalConstruct == null) { if (theConstruct as IfLogicalConstruct == null) { if (theConstruct as LoopLogicalConstruct == null) { if (theConstruct as SwitchLogicalConstruct == null) { if (theConstruct as ConditionLogicalConstruct != null) { this.ProcessLogicalConstruct((theConstruct as ConditionLogicalConstruct).get_FirstBlock()); } } else { V_6 = theConstruct as SwitchLogicalConstruct; V_7 = V_6.get_ConditionCases(); V_2 = 0; while (V_2 < (int)V_7.Length) { this.ProcessLogicalConstruct(V_7[V_2]); V_2 = V_2 + 1; } this.ProcessLogicalConstruct(V_6.get_DefaultCase()); } } else { V_5 = theConstruct as LoopLogicalConstruct; this.ProcessLogicalConstruct(V_5.get_LoopBodyBlock()); this.ProcessLogicalConstruct(V_5.get_LoopCondition()); } } else { V_4 = theConstruct as IfLogicalConstruct; this.ProcessLogicalConstruct(V_4.get_Then()); if (V_4.get_Else() != null) { this.ProcessLogicalConstruct(V_4.get_Else()); } } } else { this.ProcessLogicalConstruct((theConstruct as ExceptionHandlingLogicalConstruct).get_Try()); if (theConstruct as TryCatchFilterLogicalConstruct == null) { if (theConstruct as TryFaultLogicalConstruct == null) { if (theConstruct as TryFinallyLogicalConstruct != null) { this.ProcessLogicalConstruct((theConstruct as TryFinallyLogicalConstruct).get_Finally()); } } else { this.ProcessLogicalConstruct((theConstruct as TryFaultLogicalConstruct).get_Fault()); } } else { V_1 = (theConstruct as TryCatchFilterLogicalConstruct).get_Handlers(); V_2 = 0; while (V_2 < (int)V_1.Length) { V_3 = V_1[V_2]; if (V_3.get_HandlerType() != 1) { if (V_3.get_HandlerType() == FilteringExceptionHandlerType.Catch) { this.ProcessLogicalConstruct(V_3 as ExceptionHandlingBlockCatch); } } else { this.ProcessLogicalConstruct((V_3 as ExceptionHandlingBlockFilter).get_Filter()); this.ProcessLogicalConstruct((V_3 as ExceptionHandlingBlockFilter).get_Handler()); } V_2 = V_2 + 1; } } } } else { V_0 = (ILogicalConstruct)theConstruct.get_Entry(); while (V_0 != null) { this.ProcessLogicalConstruct(V_0); if (this.visitedConstructs.Contains(V_0.get_FollowNode())) { V_0.set_CFGFollowNode(null); } V_0 = V_0.get_FollowNode(); } this.ProcessGotoFlowConstructs(theConstruct as BlockLogicalConstruct); } dummyVar0 = this.visitedConstructs.Add(theConstruct); return; }
protected bool RemoveControllerChain() { V_0 = this.InitializeTheTraversalQueue(); while (V_0.get_Count() > 0) { V_1 = V_0.Dequeue(); V_2 = V_1; while (this.IsStateMachineControllerBlock(ref V_2, out V_4, out V_3)) { switch (V_4 - 1) { case 0: { V_6 = this.theCFG.get_SwitchBlocksInformation().get_Item(V_2); V_7 = V_6.get_OrderedCasesArray(); V_8 = 0; while (V_8 < (int)V_7.Length) { if (!this.toBeRemoved.Contains(V_7[V_8])) { V_9 = this.TryGetStateEntry(V_7[V_8], out V_5); switch (V_9) { case 0: { return(false); } case 1: { this.stateToStartBlock[V_8 + V_3] = V_5; break; } case 2: { this.stateToStartBlock[V_8 + V_3] = V_5; V_0.Enqueue(V_5); break; } } } V_8 = V_8 + 1; } V_0.Enqueue(this.SkipBranchChain(V_6.get_DefaultCase())); break; } case 1: { V_9 = this.TryGetStateEntry(V_2.get_Successors()[0], out V_10); switch (V_9) { case 0: { return(false); } case 1: { this.stateToStartBlock[V_3] = V_10; break; } case 2: { this.stateToStartBlock[V_3] = V_10; V_0.Enqueue(V_10); break; } } break; } case 2: { V_12 = 1; if (V_3 == -1) { V_3 = 0; V_12 = 0; } V_9 = this.TryGetStateEntry(V_2.get_Successors()[V_12], out V_11); if (V_9 == StateControllerRemover.ControllerTraversalSearchResult.PatternFailed) { return(false); } if (V_9 - 1 > 1) { break; } this.stateToStartBlock[V_3] = V_11; break; } } dummyVar0 = this.toBeRemoved.Add(V_2); if (V_4 != 3) { V_2 = V_2.get_Successors()[(int)V_2.get_Successors().Length - 1]; } else { V_2 = V_2.get_Successors()[0]; } V_2 = this.SkipBranchChain(V_2); } if (InstructionBlock.op_Equality(this.defaultStateEntry, null)) { this.defaultStateEntry = V_2; } this.ReattachDefaultSuccessor(V_1, V_2); while (V_0.get_Count() > 0 && this.toBeRemoved.Contains(V_0.Peek())) { dummyVar1 = V_0.Dequeue(); } } if (this.toBeRemoved.get_Count() == 0) { return(false); } this.CreateControllerSwitchData(); return(true); }