diff --git a/Jint.Tests/Jint.Tests.csproj b/Jint.Tests/Jint.Tests.csproj index f645071421..e09a93cc9c 100644 --- a/Jint.Tests/Jint.Tests.csproj +++ b/Jint.Tests/Jint.Tests.csproj @@ -33,6 +33,7 @@ + diff --git a/Jint.Tests/Runtime/ArrayTests.cs b/Jint.Tests/Runtime/ArrayTests.cs index 7c21492de0..ad5749a228 100644 --- a/Jint.Tests/Runtime/ArrayTests.cs +++ b/Jint.Tests/Runtime/ArrayTests.cs @@ -302,6 +302,31 @@ public void Concat() Assert.Equal(7, engine.Evaluate("get.length")); } + [Fact] + public void ConcatHandlesHolesCorrectly() + { + const string Code = """ + function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; + } + + new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571").map(colors); + """; + + var engine = new Engine(); + + var a = engine.Evaluate(Code).AsArray(); + + a.Length.Should().Be(5); + a[0].Should().Be(JsValue.Undefined); + a[1].Should().Be(JsValue.Undefined); + a[2].Should().Be(JsValue.Undefined); + a[3].Should().BeOfType().Which.Should().ContainInOrder("#d8b365", "#f5f5f5", "#5ab4ac"); + a[4].Should().BeOfType().Which.Should().ContainInOrder("#a6611a", "#dfc27d", "#80cdc1", "#018571"); + } + [Fact] public void Shift() { diff --git a/Jint.Tests/Runtime/TypeDescriptorTests.cs b/Jint.Tests/Runtime/TypeDescriptorTests.cs index 4d31c8c49c..1f79066f56 100644 --- a/Jint.Tests/Runtime/TypeDescriptorTests.cs +++ b/Jint.Tests/Runtime/TypeDescriptorTests.cs @@ -1,5 +1,4 @@ using System.Collections; -using FluentAssertions; using Jint.Runtime.Interop; namespace Jint.Tests.Runtime; diff --git a/Jint/Native/Array/ArrayInstance.cs b/Jint/Native/Array/ArrayInstance.cs index 8fb21e70f8..9183a45f0a 100644 --- a/Jint/Native/Array/ArrayInstance.cs +++ b/Jint/Native/Array/ArrayInstance.cs @@ -1327,20 +1327,13 @@ internal void CopyValues(JsArray source, uint sourceStartIndex, uint targetStart for (var i = sourceStartIndex; i < sourceStartIndex + length; ++i, j++) { JsValue? sourceValue; - if (i < (uint) sourceDense.Length && sourceDense[i] is not null) + if (i < (uint) sourceDense.Length) { sourceValue = sourceDense[i]; } else { - if (!source.TryGetValue(i, out var temp)) - { - sourceValue = source.Prototype?.Get(JsString.Create(i)); - } - else - { - sourceValue = temp; - } + source.TryGetValue(i, out sourceValue); } dense[targetStartIndex + j] = sourceValue;