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); }
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(); }
public void VisitForRange(ForRangeNode node) { VisitForRangeHandler(node); }