Esempio n. 1
0
        public override void Compile(Execution.VM.ByteCode bc)
        {
            List <int> endJumps = new List <int>();

            int lastIfJmp = -1;

            foreach (var ifblock in m_Ifs)
            {
                using (bc.EnterSource(ifblock.Source))
                {
                    if (lastIfJmp != -1)
                    {
                        bc.SetNumVal(lastIfJmp, bc.GetJumpPointForNextInstruction());
                    }

                    ifblock.Exp.CompilePossibleLiteral(bc);
                    lastIfJmp = bc.Emit_Jump(OpCode.Jf, -1);
                    bc.Emit_Enter(ifblock.StackFrame);
                    ifblock.Block.Compile(bc);
                }

                using (bc.EnterSource(m_End))
                    bc.Emit_Leave(ifblock.StackFrame);

                endJumps.Add(bc.Emit_Jump(OpCode.Jump, -1));
            }

            bc.SetNumVal(lastIfJmp, bc.GetJumpPointForNextInstruction());

            if (m_Else != null)
            {
                using (bc.EnterSource(m_Else.Source))
                {
                    bc.Emit_Enter(m_Else.StackFrame);
                    m_Else.Block.Compile(bc);
                }

                using (bc.EnterSource(m_End))
                    bc.Emit_Leave(m_Else.StackFrame);
            }

            foreach (var endjmp in endJumps)
            {
                bc.SetNumVal(endjmp, bc.GetJumpPointForNextInstruction());
            }
        }
Esempio n. 2
0
        public override void Compile(Execution.VM.ByteCode bc)
        {
            List <Instruction> endJumps = new List <Instruction>();

            Instruction lastIfJmp = null;

            foreach (var ifblock in m_Ifs)
            {
                using (bc.EnterSource(ifblock.Source))
                {
                    if (lastIfJmp != null)
                    {
                        lastIfJmp.NumVal = bc.GetJumpPointForNextInstruction();
                    }

                    ifblock.Exp.Compile(bc);
                    lastIfJmp = bc.Emit_Jump(OpCode.Jf, -1);
                    bc.Emit_Enter(ifblock.StackFrame);
                    ifblock.Block.Compile(bc);
                }

                using (bc.EnterSource(m_End))
                    bc.Emit_Leave(ifblock.StackFrame);

                endJumps.Add(bc.Emit_Jump(OpCode.Jump, -1));
            }

            lastIfJmp.NumVal = bc.GetJumpPointForNextInstruction();

            if (m_Else != null)
            {
                using (bc.EnterSource(m_ElseRef))
                {
                    bc.Emit_Enter(m_ElseStackFrame);
                    m_Else.Compile(bc);
                }

                using (bc.EnterSource(m_End))
                    bc.Emit_Leave(m_ElseStackFrame);
            }

            foreach (var endjmp in endJumps)
            {
                endjmp.NumVal = bc.GetJumpPointForNextInstruction();
            }
        }
Esempio n. 3
0
        public override void Compile(Execution.VM.ByteCode bc)
        {
            using (bc.EnterSource(m_Do))
                bc.Emit_Enter(m_StackFrame);

            m_Block.Compile(bc);

            using (bc.EnterSource(m_End))
                bc.Emit_Leave(m_StackFrame);
        }