示例#1
0
        private void EmitUserDefinedLiftedOperator(EmitContext ec)
        {
            LocalBuilder local = ec.EmitStored(this.operand);

            ec.EmitNullableGetValue(local);
            ec.EmitCall(this.method);
        }
示例#2
0
        void EmitUserDefinedLiftedOperator(EmitContext ec)
        {
            var local = ec.EmitStored(operand);

            ec.EmitNullableGetValue(local);
            ec.EmitCall(method);
        }
示例#3
0
        private void EmitCoalesce(EmitContext ec)
        {
            ILGenerator  ig           = ec.ig;
            Label        label        = ig.DefineLabel();
            Label        label2       = ig.DefineLabel();
            LocalBuilder localBuilder = ec.EmitStored(left);
            bool         flag         = localBuilder.LocalType.IsNullable();

            if (flag)
            {
                ec.EmitNullableHasValue(localBuilder);
            }
            else
            {
                ec.EmitLoad(localBuilder);
            }
            ig.Emit(OpCodes.Brfalse, label2);
            if (flag && !base.Type.IsNullable())
            {
                ec.EmitNullableGetValue(localBuilder);
            }
            else
            {
                ec.EmitLoad(localBuilder);
            }
            ig.Emit(OpCodes.Br, label);
            ig.MarkLabel(label2);
            ec.Emit(right);
            ig.MarkLabel(label);
        }
示例#4
0
        void EmitCoalesce(EmitContext ec)
        {
            var ig         = ec.ig;
            var done       = ig.DefineLabel();
            var load_right = ig.DefineLabel();

            var left             = ec.EmitStored(this.left);
            var left_is_nullable = left.LocalType.IsNullable();

            if (left_is_nullable)
            {
                ec.EmitNullableHasValue(left);
            }
            else
            {
                ec.EmitLoad(left);
            }

            ig.Emit(OpCodes.Brfalse, load_right);

            if (left_is_nullable && !Type.IsNullable())
            {
                ec.EmitNullableGetValue(left);
            }
            else
            {
                ec.EmitLoad(left);
            }

            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(load_right);
            ec.Emit(this.right);

            ig.MarkLabel(done);
        }