Ancestry.QueryProcessor.Type.BaseType.EmitUnaryOperator C# (CSharp) Method

EmitUnaryOperator() protected method

Overridden to determine what operators a type supports and to change how they are implemented.
protected EmitUnaryOperator ( MethodContext method, Compiler compiler, ExpressionContext inner, Parse expression ) : void
method Ancestry.QueryProcessor.Compile.MethodContext
compiler Compiler
inner Ancestry.QueryProcessor.Compile.ExpressionContext
expression Parse
return void
        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);
            }
        }