Browse Source

Fix ArrayPatternProtocol indexing for function parameters (#1348)

Marko Lahma 2 years ago
parent
commit
943ac858bb

+ 16 - 0
Jint.Tests/Runtime/DestructuringTests.cs

@@ -0,0 +1,16 @@
+namespace Jint.Tests.Runtime;
+
+public class DestructuringTests
+{
+    [Fact]
+    public void WithStrings()
+    {
+        const string Script = @"
+            return function([a, b, c]) {
+              return a === ""a"" && b === ""b"" && c === void undefined;
+            }(""ab"");";
+
+        var engine = new Engine();
+        Assert.True(engine.Evaluate(Script).AsBoolean());
+    }
+}

+ 2 - 2
Jint/Runtime/Environments/FunctionEnvironmentRecord.cs

@@ -420,7 +420,7 @@ namespace Jint.Runtime.Environments
         {
         {
             private readonly ArrayInstance _instance;
             private readonly ArrayInstance _instance;
             private readonly int _max;
             private readonly int _max;
-            private long _index = 0;
+            private long _index;
 
 
             public ArrayPatternProtocol(
             public ArrayPatternProtocol(
                 Engine engine,
                 Engine engine,
@@ -434,8 +434,8 @@ namespace Jint.Runtime.Environments
 
 
             protected override void ProcessItem(JsValue[] args, JsValue currentValue)
             protected override void ProcessItem(JsValue[] args, JsValue currentValue)
             {
             {
-                _index++;
                 _instance.SetIndexValue((uint) _index, currentValue, updateLength: false);
                 _instance.SetIndexValue((uint) _index, currentValue, updateLength: false);
+                _index++;
             }
             }
 
 
             protected override bool ShouldContinue => _index < _max;
             protected override bool ShouldContinue => _index < _max;