Author: cesar
Date: 2005-12-10 01:06:02 -0500 (Sat, 10 Dec 2005)
New Revision: 54187

Modified:
   trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/ChangeLog
   trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/CodeGenerator.cs
   trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/expression.cs
Log:
2005-12-10  Cesar Lopez Nataren  <[EMAIL PROTECTED]>

        * CodeGenerator.cs: Add EmitAssignAsExp.

        * expression.cs: Take care of uses of assigment in a expression
        context; we must save the right-side value in a local and then
        load the local. Added  Assign.EmitAndReturnBuilder.

Modified: trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/ChangeLog
===================================================================
--- trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/ChangeLog       
2005-12-10 06:00:03 UTC (rev 54186)
+++ trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/ChangeLog       
2005-12-10 06:06:02 UTC (rev 54187)
@@ -1,3 +1,11 @@
+2005-12-10  Cesar Lopez Nataren  <[EMAIL PROTECTED]>
+
+       * CodeGenerator.cs: Add EmitAssignAsExp.
+
+       * expression.cs: Take care of uses of assigment in a expression
+       context; we must save the right-side value in a local and then
+       load the local. Added  Assign.EmitAndReturnBuilder.
+
 2005-11-25  Cesar Lopez Nataren  <[EMAIL PROTECTED]>
 
        * With.cs (JScriptWith): Use Convert.Object before we cast to

Modified: trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/CodeGenerator.cs
===================================================================
--- trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/CodeGenerator.cs        
2005-12-10 06:00:03 UTC (rev 54186)
+++ trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/CodeGenerator.cs        
2005-12-10 06:06:02 UTC (rev 54187)
@@ -725,5 +725,12 @@
                {
                        return (string) source_file_to_type [srcName];
                }
+
+               internal static void EmitAssignAsExp (EmitContext ec, AST ast)
+               {
+                       Assign assign = (Assign) ast;
+                       LocalBuilder builder = assign.EmitAndReturnBuilder (ec);
+                       ec.ig.Emit (OpCodes.Ldloc, builder);
+               }
        }
 }

Modified: trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/expression.cs
===================================================================
--- trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/expression.cs   
2005-12-10 06:00:03 UTC (rev 54186)
+++ trunk/mcs/class/Microsoft.JScript/Microsoft.JScript/expression.cs   
2005-12-10 06:06:02 UTC (rev 54187)
@@ -935,8 +935,12 @@
 
                        for (int i = 0; i <= n; i++) {
                                ast = args.get_element (i);
-                               ast.Emit (ec);
 
+                               if (ast is Assign)
+                                       CodeGenerator.EmitAssignAsExp (ec, ast);
+                               else
+                                       ast.Emit (ec);
+
                                if (ast is Relational) 
                                        CodeGenerator.EmitRelationalComp (ig, 
(Relational) ast);
                                else
@@ -1103,8 +1107,13 @@
                        
                        if (n >= 1 && (member_exp.ToString () == "String" || 
member_exp.ToString () == "Boolean" || member_exp.ToString () == "Number")) {
                                ast = args.get_element (0);
-                               ast.Emit (ec);
-                               CodeGenerator.EmitBox (ig, ast);
+
+                               if (ast is Assign)
+                                       CodeGenerator.EmitAssignAsExp (ec, ast);
+                               else {
+                                       ast.Emit (ec);
+                                       CodeGenerator.EmitBox (ig, ast);
+                               }
                                return;
                        }
 
@@ -1115,8 +1124,14 @@
                                ig.Emit (OpCodes.Dup);
                                ig.Emit (OpCodes.Ldc_I4, i);
                                ast = args.get_element (i);
-                               ast.Emit (ec);
-                               CodeGenerator.EmitBox (ig, ast);
+
+                               if (ast is Assign)
+                                       CodeGenerator.EmitAssignAsExp (ec, ast);
+                               else {
+                                       ast.Emit (ec);
+                                       CodeGenerator.EmitBox (ig, ast);
+                               }
+
                                ig.Emit (OpCodes.Stelem_Ref);
                        }
                }
@@ -1807,7 +1822,10 @@
                                        if (ast != null) {
                                                ig.Emit (OpCodes.Dup);
                                                ig.Emit (OpCodes.Ldc_I4, k);
-                                               ast.Emit (ec);
+                                               if (ast is Assign)
+                                                       
CodeGenerator.EmitAssignAsExp (ec, ast);
+                                               else
+                                                       ast.Emit (ec);
 
                                                if (ast is Relational)
                                                        
CodeGenerator.EmitRelationalComp (ig, (Relational) ast);
@@ -1841,7 +1859,11 @@
                        for (int i = 0; i < n; i++, j++) {
                                ast = get_element (i);
                                if (ast != null) {
-                                       ast.Emit (ec);
+                                       if (ast is Assign) {
+                                               CodeGenerator.EmitAssignAsExp 
(ec, ast);
+                                               continue;
+                                       } else
+                                               ast.Emit (ec);
 
                                        if (ast is Relational)
                                                
CodeGenerator.EmitRelationalComp (ig, (Relational) ast);
@@ -1987,7 +2009,7 @@
                // information about the assignment
                //
                internal override bool Resolve (Environment env)
-               {                                               
+               {
                        bool r;
 
                        if (left is IAssignable)
@@ -2003,9 +2025,21 @@
 
                internal override bool Resolve (Environment env, bool no_effect)
                {
-                       return true;
+                       this.no_effect = no_effect;
+                       return Resolve (env);
                }
 
+               internal LocalBuilder EmitAndReturnBuilder (EmitContext ec)
+               {
+                       ILGenerator ig = ec.ig;
+                       LocalBuilder builder = ig.DeclareLocal (typeof 
(object));
+                       Emit (ec);
+                       right.Emit (ec);
+                       CodeGenerator.EmitBox (ig, right);
+                       ig.Emit (OpCodes.Stloc, builder);
+                       return builder;
+               }
+
                internal override void Emit (EmitContext ec)
                {
                        if (op == JSToken.Assign) {
@@ -2198,8 +2232,13 @@
                                                ig.Emit (OpCodes.Dup);
                                                ig.Emit (OpCodes.Ldc_I4, i);
                                                ast = args.get_element (i);
-                                               ast.Emit (ec);
-                                               CodeGenerator.EmitBox (ig, ast);
+
+                                               if (ast is Assign)
+                                                       
CodeGenerator.EmitAssignAsExp (ec, ast);
+                                               else {
+                                                       ast.Emit (ec);
+                                                       CodeGenerator.EmitBox 
(ig, ast);
+                                               }
                                                ig.Emit (OpCodes.Stelem_Ref);
                                        }
 
@@ -2272,8 +2311,13 @@
                                ig.Emit (OpCodes.Dup);
                                ig.Emit (OpCodes.Ldc_I4, i);
                                ast = args.get_element (i);
-                               ast.Emit (ec);
-                               CodeGenerator.EmitBox (ig, ast);
+
+                               if (ast is Assign)
+                                       CodeGenerator.EmitAssignAsExp (ec, ast);
+                               else {
+                                       ast.Emit (ec);
+                                       CodeGenerator.EmitBox (ig, ast);
+                               }
                                ig.Emit (OpCodes.Stelem_Ref);
                        }
                }

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

Reply via email to