Exemplo n.º 1
0
        private void EmitUserDefinedLiftedLogicalShortCircuit(EmitContext ec)
        {
            ILGenerator  ig     = ec.ig;
            bool         flag   = base.NodeType == ExpressionType.AndAlso;
            Label        label  = ig.DefineLabel();
            Label        label2 = ig.DefineLabel();
            Label        label3 = ig.DefineLabel();
            Label        label4 = ig.DefineLabel();
            LocalBuilder local  = ec.EmitStored(left);

            ec.EmitNullableHasValue(local);
            ig.Emit(OpCodes.Brfalse, (!flag) ? label : label3);
            ec.EmitNullableGetValueOrDefault(local);
            ec.EmitCall((!flag) ? GetTrueOperator() : GetFalseOperator());
            ig.Emit(OpCodes.Brtrue, label2);
            ig.MarkLabel(label);
            LocalBuilder local2 = ec.EmitStored(right);

            ec.EmitNullableHasValue(local2);
            ig.Emit(OpCodes.Brfalse, label3);
            ec.EmitNullableGetValueOrDefault(local);
            ec.EmitNullableGetValueOrDefault(local2);
            ec.EmitCall(method);
            ec.EmitNullableNew(base.Type);
            ig.Emit(OpCodes.Br, label4);
            ig.MarkLabel(label2);
            ec.EmitLoad(local);
            ig.Emit(OpCodes.Br, label4);
            ig.MarkLabel(label3);
            LocalBuilder local3 = ig.DeclareLocal(base.Type);

            ec.EmitNullableInitialize(local3);
            ig.MarkLabel(label4);
        }
Exemplo n.º 2
0
        private void EmitUserDefinedLogicalShortCircuit(EmitContext ec)
        {
            ILGenerator  ig    = ec.ig;
            bool         flag  = base.NodeType == ExpressionType.AndAlso;
            Label        label = ig.DefineLabel();
            LocalBuilder local = ec.EmitStored(left);

            ec.EmitLoad(local);
            ig.Emit(OpCodes.Dup);
            ec.EmitCall((!flag) ? GetTrueOperator() : GetFalseOperator());
            ig.Emit(OpCodes.Brtrue, label);
            ec.Emit(right);
            ec.EmitCall(method);
            ig.MarkLabel(label);
        }
Exemplo n.º 3
0
        void EmitLiftedToNullUserDefinedOperator(EmitContext ec)
        {
            var ig = ec.ig;

            var ret  = ig.DefineLabel();
            var done = ig.DefineLabel();

            var left  = ec.EmitStored(this.left);
            var right = ec.EmitStored(this.right);

            ec.EmitNullableHasValue(left);
            ec.EmitNullableHasValue(right);
            ig.Emit(OpCodes.And);
            ig.Emit(OpCodes.Brfalse, ret);

            ec.EmitNullableGetValueOrDefault(left);
            ec.EmitNullableGetValueOrDefault(right);
            ec.EmitCall(method);
            ec.EmitNullableNew(Type);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(ret);
            var temp = ig.DeclareLocal(Type);

            ec.EmitNullableInitialize(temp);

            ig.MarkLabel(done);
        }
Exemplo n.º 4
0
        void EmitUserDefinedLiftedOperator(EmitContext ec)
        {
            var local = ec.EmitStored(operand);

            ec.EmitNullableGetValue(local);
            ec.EmitCall(method);
        }
Exemplo n.º 5
0
 private void EmitUserDefinedOperator(EmitContext ec)
 {
     if (!IsLifted)
     {
         ExpressionType nodeType = base.NodeType;
         if (nodeType == ExpressionType.AndAlso || nodeType == ExpressionType.OrElse)
         {
             EmitUserDefinedLogicalShortCircuit(ec);
             return;
         }
         left.Emit(ec);
         right.Emit(ec);
         ec.EmitCall(method);
     }
     else if (IsLiftedToNull)
     {
         ExpressionType nodeType = base.NodeType;
         if (nodeType == ExpressionType.AndAlso || nodeType == ExpressionType.OrElse)
         {
             EmitUserDefinedLiftedLogicalShortCircuit(ec);
         }
         else
         {
             EmitLiftedToNullUserDefinedOperator(ec);
         }
     }
     else
     {
         EmitLiftedUserDefinedOperator(ec);
     }
 }
 private void EmitUserDefinedOperator(EmitContext ec)
 {
     if (!this.IsLifted)
     {
         ExpressionType nodeType = base.NodeType;
         if (nodeType != ExpressionType.AndAlso && nodeType != ExpressionType.OrElse)
         {
             this.left.Emit(ec);
             this.right.Emit(ec);
             ec.EmitCall(this.method);
         }
         else
         {
             this.EmitUserDefinedLogicalShortCircuit(ec);
         }
     }
     else if (this.IsLiftedToNull)
     {
         ExpressionType nodeType = base.NodeType;
         if (nodeType != ExpressionType.AndAlso && nodeType != ExpressionType.OrElse)
         {
             this.EmitLiftedToNullUserDefinedOperator(ec);
         }
         else
         {
             this.EmitUserDefinedLiftedLogicalShortCircuit(ec);
         }
     }
     else
     {
         this.EmitLiftedUserDefinedOperator(ec);
     }
 }
Exemplo n.º 7
0
        private void EmitUserDefinedLiftedOperator(EmitContext ec)
        {
            LocalBuilder local = ec.EmitStored(this.operand);

            ec.EmitNullableGetValue(local);
            ec.EmitCall(this.method);
        }
Exemplo n.º 8
0
        void EmitUserDefinedLiftedLogicalShortCircuit(EmitContext ec)
        {
            var ig  = ec.ig;
            var and = NodeType == ExpressionType.AndAlso;

            var left_is_null = ig.DefineLabel();
            var ret_left     = ig.DefineLabel();
            var ret_null     = ig.DefineLabel();
            var done         = ig.DefineLabel();

            var left = ec.EmitStored(this.left);

            ec.EmitNullableHasValue(left);
            ig.Emit(OpCodes.Brfalse, and ? ret_null : left_is_null);

            ec.EmitNullableGetValueOrDefault(left);
            ec.EmitCall(and ? GetFalseOperator() : GetTrueOperator());
            ig.Emit(OpCodes.Brtrue, ret_left);

            ig.MarkLabel(left_is_null);
            var right = ec.EmitStored(this.right);

            ec.EmitNullableHasValue(right);
            ig.Emit(OpCodes.Brfalse, ret_null);

            ec.EmitNullableGetValueOrDefault(left);
            ec.EmitNullableGetValueOrDefault(right);
            ec.EmitCall(method);

            ec.EmitNullableNew(Type);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(ret_left);
            ec.EmitLoad(left);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(ret_null);
            var ret = ig.DeclareLocal(Type);

            ec.EmitNullableInitialize(ret);

            ig.MarkLabel(done);
        }
Exemplo n.º 9
0
        private void EmitPropertyAccess(EmitContext ec, PropertyInfo property)
        {
            MethodInfo getMethod = property.GetGetMethod(true);

            if (!getMethod.IsStatic)
            {
                ec.EmitLoadSubject(this.expression);
            }
            ec.EmitCall(getMethod);
        }
Exemplo n.º 10
0
        void EmitUserDefinedLogicalShortCircuit(EmitContext ec)
        {
            var ig  = ec.ig;
            var and = NodeType == ExpressionType.AndAlso;

            var done = ig.DefineLabel();

            var left = ec.EmitStored(this.left);

            ec.EmitLoad(left);
            ig.Emit(OpCodes.Dup);
            ec.EmitCall(and ? GetFalseOperator() : GetTrueOperator());
            ig.Emit(OpCodes.Brtrue, done);

            ec.Emit(this.right);
            ec.EmitCall(method);

            ig.MarkLabel(done);
        }
        void EmitPropertyAccess(EmitContext ec, PropertyInfo property)
        {
            var getter = property.GetGetMethod(true);

            if (!getter.IsStatic)
            {
                ec.EmitLoadSubject(expression);
            }

            ec.EmitCall(getter);
        }
Exemplo n.º 12
0
        private void EmitPropertyAssignment(EmitContext ec, PropertyInfo property, LocalBuilder local)
        {
            MethodInfo setMethod = property.GetSetMethod(true);

            if (setMethod == null)
            {
                throw new InvalidOperationException();
            }
            ec.EmitLoadSubject(local);
            this.expression.Emit(ec);
            ec.EmitCall(setMethod);
        }
Exemplo n.º 13
0
        private LocalBuilder EmitLoadProperty(EmitContext ec, PropertyInfo property)
        {
            MethodInfo getMethod = property.GetGetMethod(nonPublic: true);

            if (getMethod == null)
            {
                throw new NotSupportedException();
            }
            LocalBuilder localBuilder = ec.ig.DeclareLocal(property.PropertyType);

            ec.EmitCall(getMethod);
            ec.ig.Emit(OpCodes.Stloc, localBuilder);
            return(localBuilder);
        }
Exemplo n.º 14
0
 private void EmitConvertFromNullable(EmitContext ec)
 {
     if (IsBoxing())
     {
         ec.Emit(operand);
         EmitBox(ec);
         return;
     }
     ec.EmitCall(operand, operand.Type.GetMethod("get_Value"));
     if (operand.Type.GetNotNullableType() != base.Type)
     {
         EmitPrimitiveConversion(ec, operand.Type.GetNotNullableType(), base.Type);
     }
 }
Exemplo n.º 15
0
        LocalBuilder EmitLoadProperty(EmitContext ec, PropertyInfo property)
        {
            var getter = property.GetGetMethod(true);

            if (getter == null)
            {
                throw new NotSupportedException();
            }

            var store = ec.ig.DeclareLocal(property.PropertyType);

            ec.EmitCall(getter);
            ec.ig.Emit(OpCodes.Stloc, store);
            return(store);
        }
Exemplo n.º 16
0
        void EmitLiftedUserDefinedOperator(EmitContext ec)
        {
            var ig = ec.ig;

            var ret_true  = ig.DefineLabel();
            var ret_false = ig.DefineLabel();
            var done      = ig.DefineLabel();

            var left  = ec.EmitStored(this.left);
            var right = ec.EmitStored(this.right);

            ec.EmitNullableHasValue(left);
            ec.EmitNullableHasValue(right);
            switch (NodeType)
            {
            case ExpressionType.Equal:
                ig.Emit(OpCodes.Bne_Un, ret_false);
                ec.EmitNullableHasValue(left);
                ig.Emit(OpCodes.Brfalse, ret_true);
                break;

            case ExpressionType.NotEqual:
                ig.Emit(OpCodes.Bne_Un, ret_true);
                ec.EmitNullableHasValue(left);
                ig.Emit(OpCodes.Brfalse, ret_false);
                break;

            default:
                ig.Emit(OpCodes.And);
                ig.Emit(OpCodes.Brfalse, ret_false);
                break;
            }

            ec.EmitNullableGetValueOrDefault(left);
            ec.EmitNullableGetValueOrDefault(right);
            ec.EmitCall(method);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(ret_true);
            ig.Emit(OpCodes.Ldc_I4_1);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(ret_false);
            ig.Emit(OpCodes.Ldc_I4_0);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(done);
        }
Exemplo n.º 17
0
 void EmitUserDefinedOperator(EmitContext ec)
 {
     if (!IsLifted)
     {
         ec.Emit(operand);
         ec.EmitCall(method);
     }
     else if (IsLiftedToNull)
     {
         EmitUserDefinedLiftedToNullOperator(ec);
     }
     else
     {
         EmitUserDefinedLiftedOperator(ec);
     }
 }
Exemplo n.º 18
0
 private void EmitUserDefinedOperator(EmitContext ec)
 {
     if (!this.IsLifted)
     {
         ec.Emit(this.operand);
         ec.EmitCall(this.method);
     }
     else if (this.IsLiftedToNull)
     {
         this.EmitUserDefinedLiftedToNullOperator(ec);
     }
     else
     {
         this.EmitUserDefinedLiftedOperator(ec);
     }
 }
Exemplo n.º 19
0
        private void EmitLiftedUserDefinedOperator(EmitContext ec)
        {
            ILGenerator  ig     = ec.ig;
            Label        label  = ig.DefineLabel();
            Label        label2 = ig.DefineLabel();
            Label        label3 = ig.DefineLabel();
            LocalBuilder local  = ec.EmitStored(this.left);
            LocalBuilder local2 = ec.EmitStored(this.right);

            ec.EmitNullableHasValue(local);
            ec.EmitNullableHasValue(local2);
            ExpressionType nodeType = base.NodeType;

            if (nodeType != ExpressionType.Equal)
            {
                if (nodeType != ExpressionType.NotEqual)
                {
                    ig.Emit(OpCodes.And);
                    ig.Emit(OpCodes.Brfalse, label2);
                }
                else
                {
                    ig.Emit(OpCodes.Bne_Un, label);
                    ec.EmitNullableHasValue(local);
                    ig.Emit(OpCodes.Brfalse, label2);
                }
            }
            else
            {
                ig.Emit(OpCodes.Bne_Un, label2);
                ec.EmitNullableHasValue(local);
                ig.Emit(OpCodes.Brfalse, label);
            }
            ec.EmitNullableGetValueOrDefault(local);
            ec.EmitNullableGetValueOrDefault(local2);
            ec.EmitCall(this.method);
            ig.Emit(OpCodes.Br, label3);
            ig.MarkLabel(label);
            ig.Emit(OpCodes.Ldc_I4_1);
            ig.Emit(OpCodes.Br, label3);
            ig.MarkLabel(label2);
            ig.Emit(OpCodes.Ldc_I4_0);
            ig.Emit(OpCodes.Br, label3);
            ig.MarkLabel(label3);
        }
Exemplo n.º 20
0
        private void EmitUserDefinedLiftedToNullOperator(EmitContext ec)
        {
            ILGenerator  ig     = ec.ig;
            LocalBuilder local  = ec.EmitStored(operand);
            Label        label  = ig.DefineLabel();
            Label        label2 = ig.DefineLabel();

            ec.EmitNullableHasValue(local);
            ig.Emit(OpCodes.Brfalse, label);
            ec.EmitNullableGetValueOrDefault(local);
            ec.EmitCall(method);
            ec.EmitNullableNew(base.Type);
            ig.Emit(OpCodes.Br, label2);
            ig.MarkLabel(label);
            LocalBuilder local2 = ig.DeclareLocal(base.Type);

            ec.EmitNullableInitialize(local2);
            ig.MarkLabel(label2);
        }
Exemplo n.º 21
0
        private void EmitLiftedUserDefinedOperator(EmitContext ec)
        {
            ILGenerator  ig     = ec.ig;
            Label        label  = ig.DefineLabel();
            Label        label2 = ig.DefineLabel();
            Label        label3 = ig.DefineLabel();
            LocalBuilder local  = ec.EmitStored(left);
            LocalBuilder local2 = ec.EmitStored(right);

            ec.EmitNullableHasValue(local);
            ec.EmitNullableHasValue(local2);
            switch (base.NodeType)
            {
            case ExpressionType.Equal:
                ig.Emit(OpCodes.Bne_Un, label2);
                ec.EmitNullableHasValue(local);
                ig.Emit(OpCodes.Brfalse, label);
                break;

            case ExpressionType.NotEqual:
                ig.Emit(OpCodes.Bne_Un, label);
                ec.EmitNullableHasValue(local);
                ig.Emit(OpCodes.Brfalse, label2);
                break;

            default:
                ig.Emit(OpCodes.And);
                ig.Emit(OpCodes.Brfalse, label2);
                break;
            }
            ec.EmitNullableGetValueOrDefault(local);
            ec.EmitNullableGetValueOrDefault(local2);
            ec.EmitCall(method);
            ig.Emit(OpCodes.Br, label3);
            ig.MarkLabel(label);
            ig.Emit(OpCodes.Ldc_I4_1);
            ig.Emit(OpCodes.Br, label3);
            ig.MarkLabel(label2);
            ig.Emit(OpCodes.Ldc_I4_0);
            ig.Emit(OpCodes.Br, label3);
            ig.MarkLabel(label3);
        }
Exemplo n.º 22
0
        void EmitUserDefinedOperator(EmitContext ec)
        {
            if (!IsLifted)
            {
                switch (NodeType)
                {
                case ExpressionType.AndAlso:
                case ExpressionType.OrElse:
                    EmitUserDefinedLogicalShortCircuit(ec);
                    break;

                default:
                    left.Emit(ec);
                    right.Emit(ec);
                    ec.EmitCall(method);
                    break;
                }
            }
            else if (IsLiftedToNull)
            {
                switch (NodeType)
                {
                case ExpressionType.AndAlso:
                case ExpressionType.OrElse:
                    EmitUserDefinedLiftedLogicalShortCircuit(ec);
                    break;

                default:
                    EmitLiftedToNullUserDefinedOperator(ec);
                    break;
                }
            }
            else
            {
                EmitLiftedUserDefinedOperator(ec);
            }
        }
Exemplo n.º 23
0
        private void EmitUserDefinedLiftedToNullOperator(EmitContext ec)
        {
            var ig    = ec.ig;
            var local = ec.EmitStored(operand);

            var ret  = ig.DefineLabel();
            var done = ig.DefineLabel();

            ec.EmitNullableHasValue(local);
            ig.Emit(OpCodes.Brfalse, ret);

            ec.EmitNullableGetValueOrDefault(local);
            ec.EmitCall(method);
            ec.EmitNullableNew(Type);
            ig.Emit(OpCodes.Br, done);

            ig.MarkLabel(ret);

            var temp = ig.DeclareLocal(Type);

            ec.EmitNullableInitialize(temp);

            ig.MarkLabel(done);
        }
Exemplo n.º 24
0
 internal void Emit(EmitContext ec, LocalBuilder local)
 {
     ec.EmitCall(local, arguments, add_method);
     EmitPopIfNeeded(ec);
 }
Exemplo n.º 25
0
 internal override void Emit(EmitContext ec)
 {
     ec.EmitCall(expression, arguments, expression.Type.GetInvokeMethod());
 }
 internal override void Emit(EmitContext ec)
 {
     ec.EmitCall(this.obj, this.arguments, this.method);
 }
Exemplo n.º 27
0
 internal override void Emit(EmitContext ec)
 {
     ec.EmitCall(obj, arguments, method);
 }