private void DoSetChains(string root, MethodDefinition caller, CallGraph graph, List <MethodDefinition> chain, bool multiple, int depth) { // if (depth > 12) // this can't be too large or the rule takes a very long time to run // return false; // For each method the caller calls, IEnumerable <MethodReference> callees = graph.GetCalls(caller); if (callees != null) { foreach (MethodReference callee in callees) { // if it's a method in the assembly we're testing, MethodState state; if (m_methods.TryGetValue(callee, out state)) { // and we haven't already called it from our root, if (!state.IsCalledFrom(root)) { // then update it's call chain and update all the methods it calls. List <MethodDefinition> schain = new List <MethodDefinition>(chain.Count + 1); schain.AddRange(chain); schain.Add(state.Method); state.SetCallChain(root, schain, multiple); DoSetChains(root, state.Method, graph, schain, multiple, depth + 1); if (m_requiredSafeTypes.IndexOf(state.Method.DeclaringType) < 0) { m_requiredSafeTypes.Add(state.Method.DeclaringType); } } } } } }