Beispiel #1
0
        public void VisitForIterator(ForIteratorNode node)
        {
            UpdateLine(node);
            PushScope();

            asm.Declare(node.Iterator.Value, VariableFlags.NONE);
            asm.MarkLocal(node.Iterator.Value);

            var idx = "__idx_" + Guid.NewGuid().ToString("n");

            asm.Declare(idx, VariableFlags.NONE);
            asm.MarkLocal(idx);
            asm.PushConstant(NeoInt.ValueOf(0));
            asm.SetLocal(idx);

            var from = "__from_" + Guid.NewGuid().ToString("n");

            asm.Declare(from, VariableFlags.NONE);
            asm.MarkLocal(from);
            node.From.Accept(this);
            asm.SetLocal(from);

            var start = asm.NewLabel();

            asm.MarkLabel(start);
            asm.GetLocal(idx);
            asm.GetLocal(from);
            asm.Length();
            asm.Eq();
            var end = asm.NewLabel();

            PushLoop(start, end, start);
            asm.Branch(end);
            asm.GetLocal(from);
            asm.GetLocal(idx);
            asm.Get();
            asm.SetLocal(node.Iterator.Value);
            asm.GetLocal(idx);
            asm.Inc();
            asm.SetLocal(idx);
            PreLoopCode(node.Code);
            node.Code.Accept(this);
            PostLoopCode(node.Code);
            asm.Jump(start);
            asm.MarkLabel(end);
            PopLoop();

            PopScope();
        }
Beispiel #2
0
 public ForIteratorNodeTests()
 {
     from    = new IdentNode(SourcePosition.NIL, "foo");
     code    = new BlockNode(SourcePosition.NIL);
     subject = new ForIteratorNode(SourcePosition.NIL, new IdentNode(SourcePosition.NIL, "i"), from, code);
 }
Beispiel #3
0
 public void VisitForIterator(ForIteratorNode node)
 {
     VisitForIteratorHandler(node);
 }