Exemple #1
0
 public override void Visit(RppRelationalBinOp node)
 {
     node.Left.Accept(this);
     node.Right.Accept(this);
 }
Exemple #2
0
        public override void Visit(RppRelationalBinOp node)
        {
            node.Left.Accept(this);
            node.Right.Accept(this);

            bool shouldJump = _targetLabel.HasValue;
            if (shouldJump)
            {
                OpCode cmpAndJumpOpCode;
                switch (node.Op)
                {
                    case "<":
                        cmpAndJumpOpCode = _onTrue ? OpCodes.Blt : OpCodes.Bge;
                        break;
                    case ">":
                        cmpAndJumpOpCode = _onTrue ? OpCodes.Bgt : OpCodes.Ble;
                        break;
                    case "==":
                        cmpAndJumpOpCode = _onTrue ? OpCodes.Beq : OpCodes.Bne_Un;
                        break;
                    case "!=":
                        cmpAndJumpOpCode = _onTrue ? OpCodes.Bne_Un : OpCodes.Beq;
                        break;
                    case ">=":
                        cmpAndJumpOpCode = _onTrue ? OpCodes.Bge : OpCodes.Blt;
                        break;
                    case "<=":
                        cmpAndJumpOpCode = _onTrue ? OpCodes.Ble : OpCodes.Bgt;
                        break;

                    default:
                        throw new Exception("Don't know how to handle " + node.Op);
                }

                _body.Emit(cmpAndJumpOpCode, _targetLabel.Value);

                Jumped = true;
            }
            else
            {
                switch (node.Op)
                {
                    case "<":
                        _body.Emit(OpCodes.Clt);
                        break;
                    case ">":
                        _body.Emit(OpCodes.Cgt);
                        break;
                    case "==":
                        _body.Emit(OpCodes.Ceq);
                        break;
                    case "!=":
                        _body.Emit(OpCodes.Cgt_Un);
                        break;
                    case ">=":
                        _body.Emit(OpCodes.Clt);
                        _body.Emit(OpCodes.Ldc_I4_0);
                        _body.Emit(OpCodes.Ceq);
                        break;
                    case "<=":
                        _body.Emit(OpCodes.Cgt);
                        _body.Emit(OpCodes.Ldc_I4_0);
                        _body.Emit(OpCodes.Ceq);
                        break;
                    default:
                        throw new Exception("Unknown op " + node.Op);
                }
            }
        }
Exemple #3
0
 public virtual void Visit(RppRelationalBinOp node)
 {
 }