2
0
Эх сурвалжийг харах

Improve JintUpdateExpression error handling (#628)

Marko Lahma 6 жил өмнө
parent
commit
47b5fb9620

+ 6 - 18
Jint.Tests/Parser/JavascriptParserTests.cs

@@ -1,31 +1,14 @@
 using System;
-using System.IO;
 using System.Linq;
-using System.Reflection;
 using Esprima;
 using Esprima.Ast;
+using Jint.Runtime;
 using Xunit;
 
 namespace Jint.Tests.Parser
 {
     public class JavascriptParserTests
     {
-        private string GetEmbeddedFile(string filename)
-        {
-            const string prefix = "Jint.Tests.Parser.Scripts.";
-
-            var assembly = typeof(JavascriptParserTests).GetTypeInfo().Assembly;
-            var scriptPath = prefix + filename;
-
-            using (var stream = assembly.GetManifestResourceStream(scriptPath))
-            {
-                using (var sr = new StreamReader(stream))
-                {
-                    return sr.ReadToEnd();
-                }
-            }
-        }
-
         [Fact]
         public void ShouldParseThis()
         {
@@ -184,5 +167,10 @@ namespace Jint.Tests.Parser
             Assert.Equal(1, expr.Location.End.Column);
         }
 
+        [Fact]
+        public void ShouldThrowErrorForInvalidLeftHandOperation()
+        {
+            Assert.Throws<JavaScriptException>(() => new Engine().Execute("~ (WE0=1)--- l('1');"));
+        }
     }
 }

+ 10 - 5
Jint/Runtime/Interpreter/Expressions/JintUpdateExpression.cs

@@ -45,14 +45,19 @@ namespace Jint.Runtime.Interpreter.Expressions
 
         private object UpdateNonIdentifier()
         {
-            var value = (Reference) _argument.Evaluate();
-            value.AssertValid(_engine);
+            if (!(_argument.Evaluate() is Reference reference))
+            {
+                ExceptionHelper.ThrowError(_engine, "Invalid left-hand side expression");
+                return null;
+            }
+
+            reference.AssertValid(_engine);
 
-            var oldValue = TypeConverter.ToNumber(_engine.GetValue(value, false));
+            var oldValue = TypeConverter.ToNumber(_engine.GetValue(reference, false));
             var newValue = oldValue + _change;
 
-            _engine.PutValue(value, newValue);
-            _engine._referencePool.Return(value);
+            _engine.PutValue(reference, newValue);
+            _engine._referencePool.Return(reference);
 
             return JsNumber.Create(_prefix ? newValue : oldValue);
         }