Exemple #1
0
        public void VisitForKeyValueIterator(ForKeyValueIteratorNode node)
        {
            UpdateLine(node);
            PushScope();

            asm.Declare(node.Key.Value, VariableFlags.NONE);
            asm.MarkLocal(node.Value.Value);
            asm.Declare(node.Value.Value, VariableFlags.NONE);
            asm.MarkLocal(node.Key.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.ObjectIndex();
            asm.SetLocal(node.Value.Value);
            asm.SetLocal(node.Key.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();
        }
 public ForKeyValueIteratorNodeTests()
 {
     from    = new IdentNode(SourcePosition.NIL, "foo");
     code    = new BlockNode(SourcePosition.NIL);
     subject = new ForKeyValueIteratorNode(SourcePosition.NIL, new IdentNode(SourcePosition.NIL, "k"), new IdentNode(SourcePosition.NIL, "v"), from, code);
 }
Exemple #3
0
 public void VisitForKeyValueIterator(ForKeyValueIteratorNode node)
 {
     VisitForKeyValueIteratorHandler(node);
 }