Пример #1
0
 public ForRangeNodeTests()
 {
     start   = new IntNode(SourcePosition.NIL, 0);
     end     = new IntNode(SourcePosition.NIL, 100);
     by      = new IntNode(SourcePosition.NIL, 3);
     code    = new BlockNode(SourcePosition.NIL);
     subject = new ForRangeNode(SourcePosition.NIL, new IdentNode(SourcePosition.NIL, "i"), start, end, by, code);
 }
Пример #2
0
        public void VisitForRange(ForRangeNode node)
        {
            UpdateLine(node);
            PushScope();

            asm.Declare(node.Iterator.Value, VariableFlags.NONE);
            node.Start.Accept(this);
            asm.MarkLocal(node.Iterator.Value);
            asm.SetLocal(node.Iterator.Value);

            var endValue = "__end_" + Guid.NewGuid().ToString("n");

            asm.Declare(endValue, VariableFlags.FINAL);
            node.End.Accept(this);
            asm.MarkLocal(endValue);
            asm.SetLocal(endValue);

            var byValue = "__by_" + Guid.NewGuid().ToString("n");

            asm.Declare(byValue, VariableFlags.FINAL);
            if (node.By != null)
            {
                node.By.Accept(this);
            }
            else
            {
                asm.PushConstant(NeoInt.ValueOf(1));
            }
            asm.MarkLocal(byValue);
            asm.SetLocal(byValue);

            var cmpValue = "__cmp_" + Guid.NewGuid().ToString("n");

            asm.Declare(cmpValue, VariableFlags.NONE);
            asm.MarkLocal(cmpValue);
            asm.PushConstant(NeoInt.ValueOf(1));
            asm.SetLocal(cmpValue);

            var skip = asm.NewLabel();

            asm.GetLocal(byValue);
            asm.PushConstant(NeoInt.ValueOf(0));
            asm.Lte();
            asm.Branch(skip);
            asm.PushConstant(NeoInt.ValueOf(-1));
            asm.SetLocal(cmpValue);
            asm.MarkLabel(skip);

            var start = asm.NewLabel();

            asm.MarkLabel(start);
            asm.GetLocal(node.Iterator.Value);
            asm.GetLocal(endValue);
            asm.Cmp();
            asm.GetLocal(cmpValue);
            asm.Eq();
            var end     = asm.NewLabel();
            var codeEnd = asm.NewLabel();

            PushLoop(start, end, codeEnd);
            asm.Branch(end);
            PreLoopCode(node.Code);
            node.Code.Accept(this);
            asm.MarkLabel(codeEnd);
            PostLoopCode(node.Code);
            asm.GetLocal(node.Iterator.Value);
            asm.GetLocal(byValue);
            asm.Add();
            asm.SetLocal(node.Iterator.Value);
            asm.Jump(start);
            asm.MarkLabel(end);
            PopLoop();

            PopScope();
        }
Пример #3
0
 public void VisitForRange(ForRangeNode node)
 {
     VisitForRangeHandler(node);
 }