Author: jambunathan
Date: 2005-05-07 15:19:49 -0400 (Sat, 07 May 2005)
New Revision: 44205

Modified:
   trunk/mcs/bmcs/ChangeLog
   trunk/mcs/bmcs/convert.cs
   trunk/mcs/bmcs/expression.cs
Log:

* convert.cs: 
* expression.cs: Miscellaneous fixes relating to
type conversions.


Modified: trunk/mcs/bmcs/ChangeLog
===================================================================
--- trunk/mcs/bmcs/ChangeLog    2005-05-07 18:54:36 UTC (rev 44204)
+++ trunk/mcs/bmcs/ChangeLog    2005-05-07 19:19:49 UTC (rev 44205)
@@ -1,3 +1,9 @@
+2005-05-01  Jambunathan K  <[EMAIL PROTECTED]>
+
+       * convert.cs: 
+       * expression.cs: Miscellaneous fixes relating to
+       type conversions.
+
 2005-04-10  Jambunathan K  <[EMAIL PROTECTED]>
 
        * First cut changes for suporting Binary Operators. All changes

Modified: trunk/mcs/bmcs/convert.cs
===================================================================
--- trunk/mcs/bmcs/convert.cs   2005-05-07 18:54:36 UTC (rev 44204)
+++ trunk/mcs/bmcs/convert.cs   2005-05-07 19:19:49 UTC (rev 44205)
@@ -208,7 +208,7 @@
 
                                // VB.NET specific: Convert Nothing to value 
types
 
-                               Expression e = NothingToPrimitiveConstants 
(expr, target_type);
+                               Expression e = NothingToPrimitiveTypes (expr, 
target_type);
                                if (e != null)
                                        return e;
 
@@ -1476,7 +1476,7 @@
                        return null;
                }
 
-               static public Constant NothingToPrimitiveConstants (Expression 
expr, Type target_type)
+               static public Constant NothingToPrimitiveTypes (Expression 
expr, Type target_type)
                {
                        NullLiteral null_literal = (NullLiteral) expr;
                        Location loc = null_literal.Location;
@@ -1498,7 +1498,7 @@
                        else if (real_target_type == TypeManager.int32_type)
                                retval = null_literal.ToInt (loc);
                        else if (real_target_type == TypeManager.int64_type)
-                               null_literal.ToLong (loc);
+                               retval = null_literal.ToLong (loc);
                        else if (real_target_type == TypeManager.decimal_type)
                                retval = null_literal.ToDecimal (loc);
                        else if (real_target_type == TypeManager.float_type)

Modified: trunk/mcs/bmcs/expression.cs
===================================================================
--- trunk/mcs/bmcs/expression.cs        2005-05-07 18:54:36 UTC (rev 44204)
+++ trunk/mcs/bmcs/expression.cs        2005-05-07 19:19:49 UTC (rev 44205)
@@ -1942,12 +1942,16 @@
                static string OperName (Operator oper)
                {
                        switch (oper){
+                       case Operator.Exponentiation:
+                               return "^";
                        case Operator.Multiply:
                                return "*";
                        case Operator.Division:
                                return "/";
+                       case Operator.IntegerDivision:
+                               return "\\";
                        case Operator.Modulus:
-                               return "%";
+                               return "Mod";
                        case Operator.Addition:
                                return "+";
                        case Operator.Subtraction:
@@ -1965,15 +1969,17 @@
                        case Operator.GreaterThanOrEqual:
                                return ">=";
                        case Operator.Equality:
-                               return "==";
+                               return "=";
                        case Operator.Inequality:
-                               return "!=";
+                               return "<>";
+                       case Operator.Like:
+                               return "Like";
                        case Operator.BitwiseAnd:
-                               return "&";
+                               return "And";
                        case Operator.BitwiseOr:
-                               return "|";
+                               return "Or";
                        case Operator.ExclusiveOr:
-                               return "^";
+                               return "Xor";
                        case Operator.LogicalOrElse:
                                return "OrElse";
                        case Operator.LogicalAndAlso:
@@ -2256,6 +2262,7 @@
                void CheckShiftArguments (EmitContext ec)
                {
                        Expression e;
+                       Type assumed_target_type = right.Type;
 
                        e = Convert.ImplicitVBConversion (ec, right, 
TypeManager.int32_type, Location);
                        if (e == null){
@@ -2273,7 +2280,8 @@
                                }
 
                                left = target_left_expr;
-                       }
+                       } else if (left.Type == TypeManager.null_type)
+                               left  = Convert.ImplicitVBConversion (ec, left, 
assumed_target_type, Location);
 
                        type = left.Type;
 
@@ -3138,6 +3146,8 @@
                        Type l = left.Type;
                        Type r = right.Type;
 
+                       //Console.WriteLine (OperName (oper) +"< "+  l + ", " + 
r + ">");
+
                        errors = Report.Errors;
                        ret_expr = HandleObjectOperands (ec);
                        if (Report.Errors > errors)
@@ -3207,11 +3217,19 @@
                        if (IsShortCircuitedLogicalExpression)
                                return this;
 
+                       if (oper == Operator.Like) {
+                               Type = TypeManager.bool_type;
+                               Expression compare_mode = new EnumConstant (new 
IntConstant ((int) RootContext.StringComparisonMode), 
+                                                                     typeof 
(Microsoft.VisualBasic.CompareMethod));                                    
+                               return new HelperMethodInvocation (ec, 
Location, TypeManager.bool_type, 
TypeManager.msvbcs_stringtype_strlike_string_string_comparemethod, left, right, 
compare_mode);
+                       }
 
+
                        //
                        // Step 0: String concatenation (because overloading 
will get this wrong)
                        //
-                       if (oper == Operator.Addition){
+                       if (oper == Operator.Addition || oper == 
Operator.Concatenation){
+
                                //
                                // If any of the arguments is a string, cast to 
string
                                //
@@ -3220,13 +3238,8 @@
                                if (left is StringConstant && right is 
StringConstant)
                                        return new StringConstant 
(((StringConstant) left).Value + ((StringConstant) right).Value);
 
-                               if (l == TypeManager.string_type || r == 
TypeManager.string_type) {
+                               if (Type == TypeManager.string_type) {
 
-                                       if (r == TypeManager.void_type || l == 
TypeManager.void_type) {
-                                               Error_OperatorCannotBeApplied 
();
-                                               return null;
-                                       }
-                                       
                                        // try to fold it in on the left
                                        if (left is StringConcat) {
 
@@ -3354,16 +3367,26 @@
 
                        while (true) {
                                ++step;
+
+                               if (step > 10)
+                                       throw new Exception ("FIXME: An 
Infinite loop when resolving <" + l + "> " + OperName (oper) + " <" + r + ">");
                                
-                               // Console.WriteLine ("STEP " + step + ":");
-                               // Console.WriteLine ("         left => " + 
target_left_expr_type + " right => " + target_right_expr_type);
+                               //Console.WriteLine ("          STEP " + step + 
":");
+                               //Console.WriteLine ("          " + "<" + 
target_left_expr_type + ", " + target_right_expr_type + ">");
                                
                                if ((target_left_expr_type == 
target_right_expr_type) && 
                                    IsOperatorDefinedForType 
(target_left_expr_type)) {
-                                       left = target_left_expr;
-                                       right = target_right_expr;
-                                       type = target_left_expr_type;
-                                       break;
+
+                                       if (target_left_expr_type == 
TypeManager.null_type) {
+                                               target_left_expr = 
target_right_expr = new IntConstant (0);
+                                               Type = TypeManager.int32_type;
+                                               return;
+                                       } else {
+                                               left = target_left_expr;
+                                               right = target_right_expr;
+                                               type = target_left_expr_type;
+                                               return;
+                                       }
                                }
 
                                if ( !IsOperatorDefinedForType 
(target_left_expr_type)) {
@@ -3390,6 +3413,10 @@
                                        continue;
                                }
 
+                               if (target_left_expr_type == 
TypeManager.null_type ||
+                                       target_right_expr_type == 
TypeManager.null_type)
+                                       break;
+
                                if (target_left_expr_type == 
TypeManager.string_type) {
                                        Type target_type;
                                        if (target_right_expr_type == 
TypeManager.date_type)
@@ -3436,15 +3463,19 @@
                                        continue;
                                }
 
-                               if ( !DoOperandPromotions(ec, target_left_expr, 
target_right_expr)) {
-                                       Error_OperatorCannotBeApplied();
-                                       return;
-                               }
+                               break;
                        }
+
+                       if ( !DoOperandPromotions(ec, target_left_expr, 
target_right_expr))
+                               Error_OperatorCannotBeApplied();
+
+                       return;
                }       
 
                bool IsOperatorDefinedForType (Type t)
                {
+                       if (t == TypeManager.null_type)
+                               return true;
                
                        switch (oper) {
 
@@ -3469,6 +3500,12 @@
 
                                break;
 
+                       case Operator.LogicalAndAlso:
+                       case Operator.LogicalOrElse:
+                               if (t == TypeManager.bool_type)
+                                       return true;
+                               break;
+
                        case Operator.RightShift:
                        case Operator.LeftShift:
 
@@ -3570,6 +3607,12 @@
                        if (t1 == t2)
                                return t1;
 
+                       if(t1 == TypeManager.null_type)
+                               return t2;
+
+                       if (t2 == TypeManager.null_type)
+                               return t1;
+
                        if (t1 == TypeManager.date_type || t1 == 
TypeManager.char_type) {
                                if (t2 == TypeManager.string_type)
                                        return t2;
@@ -3607,6 +3650,9 @@
                        
                        Type target_type = GetWiderOfTypes(l, r);
 
+                       //Console.WriteLine ("          
DoingOperandPromotions");
+                       //Console.WriteLine ("         left => " + l + " right 
=> " + r);
+                       //Console.WriteLine ("          target_type => " + 
target_type);
 
                        if (target_type == null) {
                                throw new Exception ("Types " + l + " " + r +" 
cannot be compared");

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to