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