public InstructionBlockChain CallOnExceptionInMoveNext(IPersistable executionArgs, VariableDefinition exceptionLocal)
        {
            var onExceptionMethodRef = _referenceFinder.GetMethodReference(Info.AspectAttribute.AttributeType,
                                                                           md => md.Name == "OnException");

            var setMethod = _referenceFinder.GetMethodReference(executionArgs.PersistedType,
                                                                md => md.Name == "set_Exception");

            var setExceptionOnArgsBlock = _creator.CallVoidMethod(setMethod, GetMoveNextExecutionArgs(executionArgs),
                                                                  new VariablePersistable(exceptionLocal));

            var sm            = StateMachineFromMoveNext;
            var smPersistable = new ThisLoadable(sm);

            var aspectPersistable    = new FieldPersistable(smPersistable, _aspectField.AsDefinedOn(sm));
            var callOnExceptionBlock = _creator.CallVoidMethod(onExceptionMethodRef,
                                                               aspectPersistable, GetMoveNextExecutionArgs(executionArgs));

            var callAspectOnExceptionBlockChain = new InstructionBlockChain();

            callAspectOnExceptionBlockChain.Add(setExceptionOnArgsBlock);
            callAspectOnExceptionBlockChain.Add(callOnExceptionBlock);
            return(callAspectOnExceptionBlockChain);
        }
        public InstructionBlockChain LoadTagInMoveNext(IPersistable executionArgs)
        {
            var setMethod = _referenceFinder.GetMethodReference(executionArgs.PersistedType,
                                                                md => md.Name == "set_MethodExecutionTag");
            var sm = StateMachineFromMoveNext;

            return(_creator.CallVoidMethod(setMethod, GetMoveNextExecutionArgs(executionArgs),
                                           new FieldPersistable(new ThisLoadable(sm), _tagField.AsDefinedOn(sm))));
        }