Babel.Compiler.CodeGeneratingVisitor.VisitIterCall C# (CSharp) Method

VisitIterCall() public method

public VisitIterCall ( IterCallExpression iter ) : void
iter IterCallExpression
return void
        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);
        }