public FluentEmitter Emit(Instruction instruction)
        {
            if (_emitAction == null)
            {
                _emitAction = i => MethodDefinition.Body.Instructions.Add(i);
            }

            _emitAction(instruction);
            LastEmittedInstruction = instruction;

            while (PostEmitActions.Count != 0)
            {
                var action = PostEmitActions.Dequeue();
                if (!action(this))
                {
                    PostEmitActions.Enqueue(action);
                }
            }

            if (StackValidationMode == StackValidationMode.Manual ||
                StackValidationMode == StackValidationMode.OnReturn && instruction.OpCode != OpCodes.Ret)
            {
                return(this);
            }

            var validator = new FlowControlAnalyzer(Body);

            validator.ValidateFullStackOrThrow();

            return(this);
        }
Exemple #2
0
 public void validate_all_methods_of_types_in_system_namespace()
 {
     foreach (var method in typeof(string).Assembly.GetTypes().Where(t => t.Namespace == "System")
              .SelectMany(t => t.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)))
     {
         var body     = TestModule.SafeImport(method).Resolve().Body;
         var analyzer = new FlowControlAnalyzer(body);
         analyzer.ValidateFullStackOrThrow();
     }
 }