private void EmitUnaryNegation(UnaryExpression node)
{
var operandType = GetExpressionType(node.Operand);
if (IsCheckedIntegerOperand(operandType))
{
_il.Emit(OpCodes.Ldc_I4_0);
if (IsLong(operandType) || operandType == TypeSystemServices.ULongType)
_il.Emit(OpCodes.Conv_I8);
node.Operand.Accept(this);
_il.Emit(TypeSystemServices.IsSignedNumber(operandType)
? OpCodes.Sub_Ovf
: OpCodes.Sub_Ovf_Un);
if (!IsLong(operandType) && operandType != TypeSystemServices.ULongType)
EmitCastIfNeeded(operandType, TypeSystemServices.IntType);
}
else
{
//a single/double unary negation never overflow
node.Operand.Accept(this);
_il.Emit(OpCodes.Neg);
}
}