public override void Compile(ByteCode bc) { bc.PushSourceRef(m_RefFor); Loop L = new Loop() { Scope = m_StackFrame }; bc.LoopTracker.Loops.Push(L); m_End.Compile(bc); bc.Emit_ToNum(3); m_Step.Compile(bc); bc.Emit_ToNum(2); m_Start.Compile(bc); bc.Emit_ToNum(1); int start = bc.GetJumpPointForNextInstruction(); var jumpend = bc.Emit_Jump(OpCode.JFor, -1); bc.Emit_Enter(m_StackFrame); //bc.Emit_SymStorN(m_VarName); bc.Emit_Store(m_VarName, 0, 0); m_InnerBlock.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(m_RefEnd); bc.Emit_Debug("..end"); bc.Emit_Leave(m_StackFrame); bc.Emit_Incr(1); bc.Emit_Jump(OpCode.Jump, start); bc.LoopTracker.Loops.Pop(); int exitpoint = bc.GetJumpPointForNextInstruction(); foreach (Instruction i in L.BreakJumps) { i.NumVal = exitpoint; } jumpend.NumVal = exitpoint; bc.Emit_Pop(3); bc.PopSourceRef(); }
public override void Compile(ByteCode bc) { bc.PushSourceRef(_refFor); var l = new Loop { Scope = _stackFrame }; bc.LoopTracker.Loops.Push(l); _end.Compile(bc); bc.Emit_ToNum(3); _step.Compile(bc); bc.Emit_ToNum(2); _start.Compile(bc); bc.Emit_ToNum(1); int start = bc.GetJumpPointForNextInstruction(); var jumpend = bc.Emit_Jump(OpCode.JFor, -1); bc.Emit_Enter(_stackFrame); bc.Emit_Store(_varName, 0, 0); _innerBlock.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(_refEnd); bc.Emit_Leave(_stackFrame); bc.Emit_Incr(1); bc.Emit_Jump(OpCode.Jump, start); bc.LoopTracker.Loops.Pop(); int exitpoint = bc.GetJumpPointForNextInstruction(); foreach (var i in l.BreakJumps) { i.NumVal = exitpoint; } jumpend.NumVal = exitpoint; bc.Emit_Pop(3); bc.PopSourceRef(); }