Пример #1
0
    public void visit(StmtNode_For node)
    {
        if (node.First != null)
        {
            node.First.acceptVisitor(this);
        }

        var loopLabel     = ILGenerator.DefineLabel();
        var breakLabel    = ILGenerator.DefineLabel();
        var continueLabel = ILGenerator.DefineLabel();

        m_breakLabels.Add(breakLabel);
        m_continueLabels.Add(continueLabel);

        ILGenerator.MarkLabel(loopLabel);
        new ExprNodeVisitor_CodeEmitor(this, typeof(int), node.Second);
        ILGenerator.Emit(OpCodes.Brfalse, breakLabel);
        if (node.Body != null)
        {
            node.Body.acceptVisitor(this);
        }
        ILGenerator.MarkLabel(continueLabel);
        if (node.Third != null)
        {
            node.Third.acceptVisitor(this);
        }
        ILGenerator.Emit(OpCodes.Br, loopLabel);
        ILGenerator.MarkLabel(breakLabel);

        m_continueLabels.RemoveAt(m_continueLabels.Count - 1);
        m_breakLabels.RemoveAt(m_breakLabels.Count - 1);
    }
Пример #2
0
    public void visit(StmtNode_For node)
    {
        if (node.First != null) node.First.acceptVisitor(this);

        var loopLabel = ILGenerator.DefineLabel();
        var breakLabel = ILGenerator.DefineLabel();
        var continueLabel = ILGenerator.DefineLabel();
        m_breakLabels.Add(breakLabel);
        m_continueLabels.Add(continueLabel);

        ILGenerator.MarkLabel(loopLabel);
        new ExprNodeVisitor_CodeEmitor(this, typeof(int), node.Second);
        ILGenerator.Emit(OpCodes.Brfalse, breakLabel);
        if (node.Body != null) node.Body.acceptVisitor(this);
        ILGenerator.MarkLabel(continueLabel);
        if (node.Third != null) node.Third.acceptVisitor(this);
        ILGenerator.Emit(OpCodes.Br, loopLabel);
        ILGenerator.MarkLabel(breakLabel);

        m_continueLabels.RemoveAt(m_continueLabels.Count - 1);
        m_breakLabels.RemoveAt(m_breakLabels.Count - 1);
    }