public void CheckStackLength(Type type)
        {
            IEnumerable<MethodInfo> methods = type.GetMethods()
                .Where(x => x.GetMethodBody() != null)
                .Where(x => x.DeclaringType == type);

            foreach (var method in methods)
            {
                var graph = ControlFlowGraphFactory.BuildForMethod(method);

                var walker = new ControlFlowGraphWalker<int>()
                {
                    InitialState = 0,
                    VisitingBlock = (stack, block) => stack + block.StackDiff
                };

                try
                {
                    var result = walker.WalkCore(method, graph);
                    Assert.That(result.Single(), Is.EqualTo(0), string.Format("Stack not 0 for method (static:{1}) {0}", method, method.IsStatic));
                }
                catch (Exception e)
                {
                    Assert.Fail("Type: {0} Method:{1} {2}", method, method.DeclaringType, e);
                }
            }
        }
        public void Walk(MethodInfo method, ControlFlowGraph graph)
        {
            this.recorder = new CallParameterTypesRecorder();

            this.recorder.Initialize(method);

            var variables = method.GetMethodBody().LocalVariables.ToDictionary(x => x.LocalIndex, x => PotentialType.FromType(x.LocalType));
            var parameters = method.GetParameters().ToDictionary(x => x.Position, x => PotentialType.FromType(x.ParameterType));
            var initialState = new TypeAnalysisState(variables, parameters);

            var walker = new ControlFlowGraphWalker<TypeAnalysisState>
            {
                InitialState = initialState,
                VisitingBlock = (state, block) => this.recorder.Visit(state, block.Instructions)
            };

            walker.WalkCore(method, graph);
        }