Esempio n. 1
0
        /// <summary>
        /// Emits code for relation comparison: greater, less, etc.
        /// </summary>
        private void EmitRelation(Context ctx, Type left, Type right)
        {
            var gen = ctx.CurrentMethod.Generator;

            // string comparisons
            if (left == typeof(string))
            {
                LeftOperand.Emit(ctx, true);
                RightOperand.Emit(ctx, true);

                var method = typeof(string).GetMethod("Compare", new[] { typeof(string), typeof(string) });
                gen.EmitCall(method);

                if (Kind.IsAnyOf(ComparisonOperatorKind.Less, ComparisonOperatorKind.GreaterEquals))
                {
                    gen.EmitConstant(-1);
                    gen.EmitCompareEqual();
                    if (Kind == ComparisonOperatorKind.GreaterEquals)
                    {
                        EmitInversion(gen);
                    }
                }
                else
                {
                    gen.EmitConstant(1);
                    gen.EmitCompareEqual();
                    if (Kind == ComparisonOperatorKind.LessEquals)
                    {
                        EmitInversion(gen);
                    }
                }
            }

            // numeric comparison
            LoadAndConvertNumerics(ctx);
            if (Kind.IsAnyOf(ComparisonOperatorKind.Less, ComparisonOperatorKind.GreaterEquals))
            {
                gen.EmitCompareLess();
                if (Kind == ComparisonOperatorKind.GreaterEquals)
                {
                    EmitInversion(gen);
                }
            }
            else
            {
                gen.EmitCompareGreater();
                if (Kind == ComparisonOperatorKind.LessEquals)
                {
                    EmitInversion(gen);
                }
            }
        }