Merge pull request #498 from Unroll-Me/master
[mono.git] / mcs / class / System.Core / System.Linq.Expressions / BinaryExpression.cs
index fa920f79296d31c6209cbc9c79fbfbd860fde805..143f57513f47f7ba7c38307bf8729162d48b5d95 100644 (file)
@@ -97,6 +97,7 @@ namespace System.Linq.Expressions {
                        this.is_lifted = is_lifted;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitArrayAccess (EmitContext ec)
                {
                        left.Emit (ec);
@@ -182,12 +183,12 @@ namespace System.Linq.Expressions {
 
                MethodInfo GetFalseOperator ()
                {
-                       return GetNotNullableOf (left.Type).GetMethod ("op_False", AllStatic);
+                       return GetFalseOperator (left.Type.GetNotNullableType ());
                }
 
                MethodInfo GetTrueOperator ()
                {
-                       return GetNotNullableOf (left.Type).GetMethod ("op_True", AllStatic);
+                       return GetTrueOperator (left.Type.GetNotNullableType ());
                }
 
                void EmitUserDefinedLogicalShortCircuit (EmitContext ec)
@@ -308,8 +309,7 @@ namespace System.Linq.Expressions {
 
                        ig.Emit (OpCodes.Brfalse, load_right);
 
-                       // is it the right way to do it?
-                       ec.EmitReadGlobal (conversion.Compile ());
+                       ec.Emit (conversion);
                        ec.EmitLoad (left);
                        ig.Emit (OpCodes.Callvirt, conversion.Type.GetInvokeMethod ());
 
@@ -371,10 +371,13 @@ namespace System.Linq.Expressions {
                                ig.Emit (is_unsigned ? OpCodes.Rem_Un : OpCodes.Rem);
                                break;
                        case ExpressionType.RightShift:
-                               ig.Emit (is_unsigned ? OpCodes.Shr_Un : OpCodes.Shr);
-                               break;
                        case ExpressionType.LeftShift:
-                               ig.Emit (OpCodes.Shl);
+                               ig.Emit (OpCodes.Ldc_I4, left.Type == typeof (int) ? 0x1f : 0x3f);
+                               ig.Emit (OpCodes.And);
+                               if (NodeType == ExpressionType.RightShift)
+                                       ig.Emit (is_unsigned ? OpCodes.Shr_Un : OpCodes.Shr);
+                               else
+                                       ig.Emit (OpCodes.Shl);
                                break;
                        case ExpressionType.And:
                                ig.Emit (OpCodes.And);
@@ -766,5 +769,6 @@ namespace System.Linq.Expressions {
                                throw new NotSupportedException (this.NodeType.ToString ());
                        }
                }
+#endif
        }
 }