Browse Source

Fixing assignment evaluation order

Fixes #225
Sebastien Ros 10 years ago
parent
commit
bc34441b79
2 changed files with 17 additions and 3 deletions
  1. 16 1
      Jint.Tests/Runtime/EngineTests.cs
  2. 1 2
      Jint/Runtime/ExpressionIntepreter.cs

+ 16 - 1
Jint.Tests/Runtime/EngineTests.cs

@@ -9,7 +9,6 @@ using Jint.Parser.Ast;
 using Jint.Runtime;
 using Jint.Runtime;
 using Jint.Runtime.Debugger;
 using Jint.Runtime.Debugger;
 using Xunit;
 using Xunit;
-using Xunit.Extensions;
 using System.Net;
 using System.Net;
 
 
 namespace Jint.Tests.Runtime
 namespace Jint.Tests.Runtime
@@ -1480,5 +1479,21 @@ namespace Jint.Tests.Runtime
 
 
             Assert.Equal(5, countBreak);
             Assert.Equal(5, countBreak);
         }
         }
+
+        [Fact]
+        public void ShouldEvaluateVariableAssignmentFromLeftToRight()
+        {
+            RunTest(@"
+                var keys = ['a']
+                  , source = { a: 3}
+                  , target = {}
+                  , key
+                  , i = 0;
+                target[key = keys[i++]] = source[key];
+                assert(i == 1);
+                assert(key == 'a');
+                assert(target[key] == 3);
+            ");
+        }
     }
     }
 }
 }

+ 1 - 2
Jint/Runtime/ExpressionIntepreter.cs

@@ -41,9 +41,8 @@ namespace Jint.Runtime
 
 
         public JsValue EvaluateAssignmentExpression(AssignmentExpression assignmentExpression)
         public JsValue EvaluateAssignmentExpression(AssignmentExpression assignmentExpression)
         {
         {
-            JsValue rval = _engine.GetValue(EvaluateExpression(assignmentExpression.Right));
-
             var lref = EvaluateExpression(assignmentExpression.Left) as Reference;
             var lref = EvaluateExpression(assignmentExpression.Left) as Reference;
+            JsValue rval = _engine.GetValue(EvaluateExpression(assignmentExpression.Right));
 
 
             if (lref == null)
             if (lref == null)
             {
             {