Browse Source

Fixing update expressions

Sebastien Ros 12 years ago
parent
commit
0b371cbc4e

+ 5 - 1
Jint.Tests.Ecma/EcmaTest.cs

@@ -76,7 +76,10 @@ namespace Jint.Tests.Ecma
             RunTestCode(code, negative);
             RunTestCode(code, negative);
             
             
         }
         }
+    }
 
 
+    public class EcmaTestTests : EcmaTest
+    {
         [Fact]
         [Fact]
         public void EcmaTestPassSucceededTestCase()
         public void EcmaTestPassSucceededTestCase()
         {
         {
@@ -87,7 +90,7 @@ namespace Jint.Tests.Ecma
                 runTestCase(testcase);
                 runTestCase(testcase);
             ", false);
             ", false);
         }
         }
-        
+
         [Fact]
         [Fact]
         public void EcmaTestPassNegativeTestCase()
         public void EcmaTestPassNegativeTestCase()
         {
         {
@@ -98,5 +101,6 @@ namespace Jint.Tests.Ecma
                 runTestCase(testcase);
                 runTestCase(testcase);
             ", true);
             ", true);
         }
         }
+
     }
     }
 }
 }

+ 1 - 4
Jint/Parser/Ast/UpdateExpression.cs

@@ -1,9 +1,6 @@
 namespace Jint.Parser.Ast
 namespace Jint.Parser.Ast
 {
 {
-    public class UpdateExpression : Expression
+    public class UpdateExpression : UnaryExpression
     {
     {
-        public string Operator;
-        public Expression Argument;
-        public bool Prefix;
     }
     }
 }
 }

+ 1 - 1
Jint/Parser/JavascriptParser.cs

@@ -1710,7 +1710,7 @@ namespace Jint.Parser
         {
         {
             if (op == "++" || op == "--")
             if (op == "++" || op == "--")
             {
             {
-                return new UnaryExpression
+                return new UpdateExpression
                     {
                     {
                         Type = SyntaxNodes.UpdateExpression,
                         Type = SyntaxNodes.UpdateExpression,
                         Operator = op,
                         Operator = op,

+ 32 - 44
Jint/Runtime/ExpressionIntepreter.cs

@@ -594,26 +594,46 @@ namespace Jint.Runtime
 
 
         public object EvaluateUpdateExpression(UpdateExpression updateExpression)
         public object EvaluateUpdateExpression(UpdateExpression updateExpression)
         {
         {
-            var r = EvaluateExpression(updateExpression.Argument) as Reference;
-
-            var value = _engine.GetValue(r);
-            var old = value;
+            var value = _engine.EvaluateExpression(updateExpression.Argument);
+            Reference r;
 
 
             switch (updateExpression.Operator)
             switch (updateExpression.Operator)
             {
             {
-                case "++" :
-                    value = TypeConverter.ToNumber(value) + 1;
-                    break;
+                case "++":
+                    r = value as Reference;
+                    if (r != null
+                        && r.IsStrict()
+                        && (r.GetBase() is EnvironmentRecord)
+                        && (Array.IndexOf(new[] { "eval", "arguments" }, r.GetReferencedName()) != -1))
+                    {
+                        throw new JavaScriptException(_engine.SyntaxError);
+                    }
+
+                    var oldValue = _engine.GetValue(value);
+                    var newValue = TypeConverter.ToNumber(oldValue) + 1;
+                    _engine.PutValue(r, newValue);
+
+                    return updateExpression.Prefix ? newValue : oldValue;
+
                 case "--":
                 case "--":
-                    value = TypeConverter.ToNumber(value) - 1;
-                    break;
+                    r = value as Reference;
+                    if (r != null
+                        && r.IsStrict()
+                        && (r.GetBase() is EnvironmentRecord)
+                        && (Array.IndexOf(new[] { "eval", "arguments" }, r.GetReferencedName()) != -1))
+                    {
+                        throw new JavaScriptException(_engine.SyntaxError);
+                    }
+
+                    oldValue = _engine.GetValue(value);
+                    newValue = TypeConverter.ToNumber(oldValue) - 1;
+                    _engine.PutValue(r, newValue);
+
+                    return updateExpression.Prefix ? newValue : oldValue;
                 default:
                 default:
                     throw new ArgumentException();
                     throw new ArgumentException();
             }
             }
 
 
-            _engine.PutValue(r, value);
-
-            return updateExpression.Prefix ? value : old;
         }
         }
 
 
         public object EvaluateThisExpression(ThisExpression thisExpression)
         public object EvaluateThisExpression(ThisExpression thisExpression)
@@ -654,38 +674,6 @@ namespace Jint.Runtime
 
 
             switch (unaryExpression.Operator)
             switch (unaryExpression.Operator)
             {
             {
-                case "++" :
-                    r = value as Reference;
-                    if(r != null 
-                        && r.IsStrict() 
-                        && (r.GetBase() is EnvironmentRecord )
-                        && (Array.IndexOf(new []{"eval", "arguments"}, r.GetReferencedName()) != -1) )
-                    {
-                        throw new JavaScriptException(_engine.SyntaxError);
-                    }
-
-                    var oldValue = _engine.GetValue(value);
-                    var newValue = TypeConverter.ToNumber(value) + 1;
-                    _engine.PutValue(r, newValue);
-
-                    return unaryExpression.Prefix ? newValue : oldValue;
-                    
-                case "--":
-                    r = value as Reference;
-                    if(r != null 
-                        && r.IsStrict() 
-                        && (r.GetBase() is EnvironmentRecord )
-                        && (Array.IndexOf(new []{"eval", "arguments"}, r.GetReferencedName()) != -1) )
-                    {
-                        throw new JavaScriptException(_engine.SyntaxError);
-                    }
-
-                    oldValue = _engine.GetValue(value);
-                    newValue = TypeConverter.ToNumber(value) - 1;
-                    _engine.PutValue(r, newValue);
-
-                    return unaryExpression.Prefix ? newValue : oldValue;
-                    
                 case "+":
                 case "+":
                     return TypeConverter.ToNumber(_engine.GetValue(value));
                     return TypeConverter.ToNumber(_engine.GetValue(value));