Ejemplo n.º 1
0
        public override IAstNode UnaryExpression(UnaryExpression unaryExpression)
        {
            if (unaryExpression.Type == ExpressionType.Minus)
            {
                var constant = unaryExpression.Operand as Constant;

                if (constant != null)
                {
                    var unparsedNumber = constant.Value as UnparsedNumber;

                    // We do not parse hex in this manner because int.Parse
                    // doesn't allow hex and sign to be combined.

                    if (
                        unparsedNumber != null &&
                        TypeUtil.IsConvertible(unparsedNumber.Type) &&
                        (unparsedNumber.NumberStyles & NumberStyles.AllowHexSpecifier) == 0
                    ) {
                        // Actually parse the constant including the minus sign.

                        unparsedNumber = new UnparsedNumber("-" + unparsedNumber.Value, unparsedNumber.Type, unparsedNumber.NumberStyles | NumberStyles.AllowLeadingSign);

                        return new Constant(
                            unparsedNumber.Parse()
                        );
                    }
                }
            }

            return base.UnaryExpression(unaryExpression);
        }
Ejemplo n.º 2
0
        public override IExpression UnaryExpression(UnaryExpression unaryExpression)
        {
            var operand = unaryExpression.Operand.Accept(this);

            // Coerce -(uint) to -(ulong)(uint)

            if (
                unaryExpression.ExpressionType == ExpressionType.Minus &&
                operand.Type == typeof(uint)
            )
                return new UnaryExpression(new Cast(operand, typeof(long)), typeof(long), ExpressionType.Minus);

            if (operand == unaryExpression.Operand)
                return unaryExpression;
            else
                return new UnaryExpression(operand, unaryExpression.Type, unaryExpression.ExpressionType);
        }
Ejemplo n.º 3
0
            public void UnaryExpression(UnaryExpression unaryExpression)
            {
                switch (unaryExpression.ExpressionType)
                {
                    case ExpressionType.Minus:
                        unaryExpression.Operand.Accept(this);

                        _il.Emit(OpCodes.Neg);
                        break;

                    case ExpressionType.Not:
                        unaryExpression.Operand.Accept(this);

                        if (TypeUtil.IsInteger(unaryExpression.Operand.Type))
                            _il.Emit(OpCodes.Not);
                        else
                        {
                            ILUtil.EmitConstant(_il, 0);
                            _il.Emit(OpCodes.Ceq);
                        }
                        break;

                    case ExpressionType.LogicalNot:
                        unaryExpression.Operand.Accept(this);

                        ILUtil.EmitConstant(_il, 0);
                        _il.Emit(OpCodes.Ceq);
                        break;

                    case ExpressionType.BitwiseNot:
                        unaryExpression.Operand.Accept(this);

                        _il.Emit(OpCodes.Not);
                        break;

                    case ExpressionType.Plus:
                    case ExpressionType.Group:
                        // No-ops.

                        unaryExpression.Operand.Accept(this);
                        break;

                    default:
                        throw new NotSupportedException();
                }
            }