public static BlockLogicalConstruct GetNearestGuardedBlock(ILogicalConstruct start) { V_0 = start; while (V_0 != null && V_0 as ExceptionHandlingLogicalConstruct == null) { V_0 = (ILogicalConstruct)V_0.get_Parent(); } if (V_0 == null) { return(null); } if ((V_0 as ExceptionHandlingLogicalConstruct).get_Try().get_CFGBlocks().Contains(start.get_FirstBlock())) { return((V_0 as ExceptionHandlingLogicalConstruct).get_Try()); } if (V_0 as TryCatchFilterLogicalConstruct == null) { if (V_0 as TryFinallyLogicalConstruct != null) { return((V_0 as TryFinallyLogicalConstruct).get_Finally()); } if (V_0 as TryFaultLogicalConstruct == null) { throw new Exception("Unknown type of exception handling logical construct encountered."); } return((V_0 as TryFaultLogicalConstruct).get_Fault()); } V_1 = (V_0 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 as ExceptionHandlingBlockFilter).get_Filter().get_CFGBlocks().Contains(start.get_FirstBlock())) { return((V_3 as ExceptionHandlingBlockFilter).get_Filter()); } return((V_3 as ExceptionHandlingBlockFilter).get_Handler()); } if (V_3.get_HandlerType() == FilteringExceptionHandlerType.Catch) { return(V_3 as ExceptionHandlingBlockCatch); } V_2 = V_2 + 1; } return(null); }
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; }