public override void VisitIterCall(IterCallExpression iter)
{
Label moveNextLabel = ilGenerator.DefineLabel();
Label getCurrentLabel = ilGenerator.DefineLabel();
iter.Local.Declare(ilGenerator);
iter.Local.EmitLoad(ilGenerator);
ilGenerator.Emit(OpCodes.Brtrue, moveNextLabel);
iter.Local.EmitStorePrefix(ilGenerator);
MethodInfo method = iter.Method;
ParameterInfo[] parameters = typeManager.GetParameters(method);
int i = iter.IsBuiltin ? 1 : 0;
if (iter.Receiver != null)
iter.Receiver.Accept(this);
foreach (ModalExpression arg in iter.CreatorArguments) {
ParameterInfo param = parameters[i++];
ArgumentMode mode = typeManager.GetArgumentMode(param);
arg.Accept(this);
BoxIfNecessary(arg.RawType, param.ParameterType);
}
if (iter.Receiver != null &&
iter.Receiver.RawType.IsInterface)
ilGenerator.EmitCall(OpCodes.Callvirt, method, null);
else
ilGenerator.EmitCall(OpCodes.Call, method, null);
iter.Local.EmitStore(ilGenerator);
ilGenerator.MarkLabel(moveNextLabel);
iter.MoveNext.Accept(this);
ilGenerator.Emit(OpCodes.Brtrue, getCurrentLabel);
ilGenerator.Emit(OpCodes.Leave, currentLoop.EndLabel);
ilGenerator.MarkLabel(getCurrentLabel);
if (iter.GetCurrent != null)
iter.GetCurrent.Accept(this);
}