Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / System.Core / System.Linq.Expressions / ConstantExpression.cs
index f59a05d6b638b8b5cc2a5dfef0bb3b54c2ae7622..38a7b3cab66116f54649681a2016c64a5b4de9af 100644 (file)
@@ -50,11 +50,33 @@ namespace System.Linq.Expressions {
                        this.value = value;
                }
 
+#if !FULL_AOT_RUNTIME
                internal override void Emit (EmitContext ec)
                {
-                       ILGenerator ig = ec.ig;
+                       if (Type.IsNullable ()) {
+                               EmitNullableConstant (ec, Type, value);
+                               return;
+                       }
+
+                       EmitConstant (ec, Type, value);
+               }
 
-                       switch (Type.GetTypeCode (Type)){
+               void EmitNullableConstant (EmitContext ec, Type type, object value)
+               {
+                       if (value == null) {
+                               var local = ec.ig.DeclareLocal (type);
+                               ec.EmitNullableInitialize (local);
+                       } else {
+                               EmitConstant (ec, type.GetFirstGenericArgument (), value);
+                               ec.EmitNullableNew (type);
+                       }
+               }
+
+               void EmitConstant (EmitContext ec, Type type, object value)
+               {
+                       var ig = ec.ig;
+
+                       switch (Type.GetTypeCode (type)){
                        case TypeCode.Byte:
                                ig.Emit (OpCodes.Ldc_I4, (int) ((byte)value));
                                return;
@@ -144,6 +166,10 @@ namespace System.Linq.Expressions {
                                return;
                        }
 
+                       case TypeCode.DBNull:
+                               ig.Emit (OpCodes.Ldsfld, typeof (DBNull).GetField ("Value", BindingFlags.Public | BindingFlags.Static));
+                               return;
+
                        case TypeCode.String:
                                EmitIfNotNull (ec, c => c.ig.Emit (OpCodes.Ldstr, (string) value));
                                return;
@@ -159,21 +185,12 @@ namespace System.Linq.Expressions {
                void EmitIfNotNull (EmitContext ec, Action<EmitContext> emit)
                {
                        if (value == null) {
-                               var ig = ec.ig;
-
-                               if (Type.IsValueType) { // happens for nullable types
-                                       var local = ig.DeclareLocal (Type);
-                                       ig.Emit (OpCodes.Ldloca, local);
-                                       ig.Emit (OpCodes.Initobj, Type);
-                                       ig.Emit (OpCodes.Ldloc, local);
-                               } else {
-                                       ec.ig.Emit (OpCodes.Ldnull);
-                               }
-
+                               ec.ig.Emit (OpCodes.Ldnull);
                                return;
                        }
 
                        emit (ec);
                }
+#endif
        }
 }