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); }
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); }
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(); } }