From feeaa689ff61a68a4d4a981a2c62e88f3b4264d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9=20LARIVIERE?= Date: Mon, 22 May 2023 15:27:57 +0200 Subject: [PATCH 1/3] When combining 2 arrays, array B should be reused but array A was passed instead --- src/Fabulous.Tests/ArrayTests.fs | 23 +++++++++++++++++++++++ src/Fabulous.Tests/Fabulous.Tests.fsproj | 1 + src/Fabulous/Array.fs | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/Fabulous.Tests/ArrayTests.fs diff --git a/src/Fabulous.Tests/ArrayTests.fs b/src/Fabulous.Tests/ArrayTests.fs new file mode 100644 index 000000000..31023269d --- /dev/null +++ b/src/Fabulous.Tests/ArrayTests.fs @@ -0,0 +1,23 @@ +namespace Fabulous.Tests + +open Fabulous.StackAllocatedCollections +open NUnit.Framework +open Fabulous + +[] +type ``Array tests``() = + [] + member _.``MutStackArray1.combineMut reuses array B if can fit all data``() = + let arrB = Array.zeroCreate 7 + + let a = MutStackArray1.Many((2us, Array.zeroCreate 4)) + let b = MutStackArray1.Many((5us, arrB)) + let c = MutStackArray1.combineMut(&a, b) + let cOpt = MutStackArray1.toArraySlice &c + let struct (usedC, arrC) = cOpt.Value + + // We should have the same number of used items + Assert.AreEqual(7us, usedC) + + // Reference should be equal to arrB since the array was reused + Assert.AreEqual(arrC, Array.zeroCreate 7) diff --git a/src/Fabulous.Tests/Fabulous.Tests.fsproj b/src/Fabulous.Tests/Fabulous.Tests.fsproj index e601174b1..75566b9b0 100644 --- a/src/Fabulous.Tests/Fabulous.Tests.fsproj +++ b/src/Fabulous.Tests/Fabulous.Tests.fsproj @@ -14,6 +14,7 @@ + diff --git a/src/Fabulous/Array.fs b/src/Fabulous/Array.fs index 500e70eca..8f923d9ff 100644 --- a/src/Fabulous/Array.fs +++ b/src/Fabulous/Array.fs @@ -498,7 +498,7 @@ module StackAllocatedCollections = let arr = ArraySlice.shiftByMut &sliceB (uint16 usedA) Array.blit arrA 0 arr 0 usedA - Many(newSize, arrA) + Many(newSize, arr) else // None of them can fit the result // thus allocate a new one From 842a43d619b8f24fab0a7cd3dbb74f9f126ab6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9=20LARIVIERE?= Date: Mon, 22 May 2023 15:32:18 +0200 Subject: [PATCH 2/3] Correct reference equals check --- src/Fabulous.Tests/ArrayTests.fs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Fabulous.Tests/ArrayTests.fs b/src/Fabulous.Tests/ArrayTests.fs index 31023269d..1df0ddacf 100644 --- a/src/Fabulous.Tests/ArrayTests.fs +++ b/src/Fabulous.Tests/ArrayTests.fs @@ -1,5 +1,6 @@ namespace Fabulous.Tests +open System open Fabulous.StackAllocatedCollections open NUnit.Framework open Fabulous @@ -20,4 +21,4 @@ type ``Array tests``() = Assert.AreEqual(7us, usedC) // Reference should be equal to arrB since the array was reused - Assert.AreEqual(arrC, Array.zeroCreate 7) + Assert.True(Object.ReferenceEquals(arrC, arrB)) From a0bbb975160385b1eb6f859c5a22db4112ea1ea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9=20LARIVIERE?= Date: Mon, 22 May 2023 15:34:46 +0200 Subject: [PATCH 3/3] Add changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 647ce812a..65958a16f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -_No unreleased changes_ +### Fixed +- Fix an issue in `MutStackArray1.combineMut` that could result in a crash by @TimLariviere (https://github.com/fabulous-dev/Fabulous/pull/1042) ## [2.3.0] - 2023-03-17