Ver código fonte

Fixing left hand side reference error

Sebastien Ros 12 anos atrás
pai
commit
2547d44263

+ 1 - 0
Jint.Tests.Ecma/Ecma/11.13.1.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 
 namespace Jint.Tests.Ecma
 namespace Jint.Tests.Ecma
 {
 {
+    [Trait("Category", "Pass")]
     public class Test_11_13_1 : EcmaTest
     public class Test_11_13_1 : EcmaTest
     {
     {
         [Fact]
         [Fact]

+ 6 - 4
Jint/Parser/JavascriptParser.cs

@@ -2692,10 +2692,12 @@ namespace Jint.Parser
             if (MatchAssign())
             if (MatchAssign())
             {
             {
                 // LeftHandSideExpression
                 // LeftHandSideExpression
-                if (!isLeftHandSide(left))
-                {
-                    ThrowErrorTolerant(Token.Empty, Messages.InvalidLHSInAssignment);
-                }
+
+                // Ignore issue as it needs to throw a ReferenceError instead of a SyntaxError
+                //if (!isLeftHandSide(left))
+                //{
+                //    ThrowErrorTolerant(Token.Empty, Messages.InvalidLHSInAssignment);
+                //}
 
 
                 // 11.13.1
                 // 11.13.1
                 if (_strict && left.Type == SyntaxNodes.Identifier && IsRestrictedWord(((Identifier) left).Name))
                 if (_strict && left.Type == SyntaxNodes.Identifier && IsRestrictedWord(((Identifier) left).Name))

+ 6 - 1
Jint/Runtime/ExpressionIntepreter.cs

@@ -48,7 +48,12 @@ namespace Jint.Runtime
 
 
             if (assignmentExpression.Operator == "=")
             if (assignmentExpression.Operator == "=")
             {
             {
-                if(lref != null && lref.IsStrict() && lref.GetBase() is EnvironmentRecord && (lref.GetReferencedName() == "eval" || lref.GetReferencedName() == "arguments"))
+                if (lref == null)
+                {
+                    throw new JavaScriptException(_engine.ReferenceError);
+                }
+
+                if(lref.IsStrict() && lref.GetBase() is EnvironmentRecord && (lref.GetReferencedName() == "eval" || lref.GetReferencedName() == "arguments"))
                 {
                 {
                     throw new JavaScriptException(_engine.SyntaxError);
                     throw new JavaScriptException(_engine.SyntaxError);
                 }
                 }

+ 6 - 0
Jint/Runtime/StatementInterpreter.cs

@@ -473,6 +473,12 @@ namespace Jint.Runtime
                         throw new ArgumentException();
                         throw new ArgumentException();
                     }
                     }
 
 
+                    if (lhs.IsStrict() && lhs.GetBase() is EnvironmentRecord &&
+                        (lhs.GetReferencedName() == "eval" || lhs.GetReferencedName() == "arguments"))
+                    {
+                        throw new JavaScriptException(_engine.SyntaxError);
+                    }
+
                     lastIdentifier = lhs.GetReferencedName();
                     lastIdentifier = lhs.GetReferencedName();
                     var value = _engine.GetValue(_engine.EvaluateExpression(declaration.Init));
                     var value = _engine.GetValue(_engine.EvaluateExpression(declaration.Init));
                     _engine.PutValue(lhs, value);
                     _engine.PutValue(lhs, value);