protected virtual void EmitUnaryOperator(MethodContext method, Compiler compiler, ExpressionContext inner, Parse.UnaryExpression expression)
{
var innerType = inner.Type.GetNative(compiler.Emitter);
inner.EmitGet(method);
switch (expression.Operator)
{
case Parse.Operator.Exists:
method.IL.Emit(OpCodes.Pop);
method.IL.Emit(OpCodes.Ldc_I4_1); // true
break;
case Parse.Operator.IsNull:
method.IL.Emit(OpCodes.Pop);
method.IL.Emit(OpCodes.Ldc_I4_0); // false
break;
case Parse.Operator.Negate:
if (!CallClassOp(method, "op_UnaryNegation", innerType))
method.IL.Emit(OpCodes.Neg);
break;
case Parse.Operator.Not:
if (!CallClassOp(method, "op_Negation", innerType))
method.IL.Emit(OpCodes.Not);
break;
case Parse.Operator.BitwiseNot:
if (!CallClassOp(method, "op_OnesComplement", innerType))
method.IL.Emit(OpCodes.Not);
break;
case Parse.Operator.Successor:
method.IL.Emit(OpCodes.Ldc_I4_1);
method.IL.Emit(OpCodes.Add);
break;
case Parse.Operator.Predicessor:
method.IL.Emit(OpCodes.Ldc_I4_1);
method.IL.Emit(OpCodes.Sub);
break;
default: throw NotSupported(expression);
}
}