From f8e033e56002396b404845aa2d8f70512eeab7bf Mon Sep 17 00:00:00 2001 From: majorro Date: Sun, 12 Jan 2025 15:36:53 +0300 Subject: [PATCH 1/9] add explicit System.Buffers, remove redundant code --- Directory.Packages.props | 3 +- src/SharpCompress/BufferPool.cs | 33 ------------ .../Compressors/Rar/RarStream.cs | 9 ++-- src/SharpCompress/SharpCompress.csproj | 1 + src/SharpCompress/packages.lock.json | 51 ++++++++++++------- tests/SharpCompress.Test/packages.lock.json | 11 +++- 6 files changed, 50 insertions(+), 58 deletions(-) delete mode 100644 src/SharpCompress/BufferPool.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 09060b11..498bf1b5 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,6 +7,7 @@ + @@ -15,4 +16,4 @@ - + \ No newline at end of file diff --git a/src/SharpCompress/BufferPool.cs b/src/SharpCompress/BufferPool.cs deleted file mode 100644 index 895edc86..00000000 --- a/src/SharpCompress/BufferPool.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Buffers; - -namespace SharpCompress.Helpers; - -internal static class BufferPool -{ - /// - /// gets a buffer from the pool - /// - /// size of the buffer - /// the buffer - public static byte[] Rent(int bufferSize) - { -#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER - return ArrayPool.Shared.Rent(bufferSize); -#else - return new byte[bufferSize]; -#endif - } - - /// - /// returns a buffer to the pool - /// - /// the buffer to return - public static void Return(byte[] buffer) - { -#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER - ArrayPool.Shared.Return(buffer); -#else - // no-op -#endif - } -} diff --git a/src/SharpCompress/Compressors/Rar/RarStream.cs b/src/SharpCompress/Compressors/Rar/RarStream.cs index bf5d3209..073fcaa0 100644 --- a/src/SharpCompress/Compressors/Rar/RarStream.cs +++ b/src/SharpCompress/Compressors/Rar/RarStream.cs @@ -1,6 +1,7 @@ #nullable disable using System; +using System.Buffers; using System.IO; using SharpCompress.Common.Rar.Headers; @@ -14,7 +15,7 @@ internal class RarStream : Stream private bool fetch; - private byte[] tmpBuffer = BufferPool.Rent(65536); + private byte[] tmpBuffer = ArrayPool.Shared.Rent(65536); private int tmpOffset; private int tmpCount; @@ -42,7 +43,7 @@ internal class RarStream : Stream { if (disposing) { - BufferPool.Return(this.tmpBuffer); + ArrayPool.Shared.Return(this.tmpBuffer); this.tmpBuffer = null; } isDisposed = true; @@ -143,11 +144,11 @@ internal class RarStream : Stream this.tmpBuffer.Length * 2 > this.tmpCount + count ? this.tmpBuffer.Length * 2 : this.tmpCount + count; - var newBuffer = BufferPool.Rent(newLength); + var newBuffer = ArrayPool.Shared.Rent(newLength); Buffer.BlockCopy(this.tmpBuffer, 0, newBuffer, 0, this.tmpCount); var oldBuffer = this.tmpBuffer; this.tmpBuffer = newBuffer; - BufferPool.Return(oldBuffer); + ArrayPool.Shared.Return(oldBuffer); } } } diff --git a/src/SharpCompress/SharpCompress.csproj b/src/SharpCompress/SharpCompress.csproj index 6b31b2a4..4b4909b7 100644 --- a/src/SharpCompress/SharpCompress.csproj +++ b/src/SharpCompress/SharpCompress.csproj @@ -33,6 +33,7 @@ true + diff --git a/src/SharpCompress/packages.lock.json b/src/SharpCompress/packages.lock.json index d5c6af0b..3e2da73d 100644 --- a/src/SharpCompress/packages.lock.json +++ b/src/SharpCompress/packages.lock.json @@ -30,6 +30,12 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "System.Buffers": { + "type": "Direct", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.Memory": { "type": "Direct", "requested": "[4.5.5, )", @@ -76,11 +82,6 @@ "resolved": "8.0.0", "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, "System.Numerics.Vectors": { "type": "Transitive", "resolved": "4.5.0", @@ -129,6 +130,12 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, + "System.Buffers": { + "type": "Direct", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.Memory": { "type": "Direct", "requested": "[4.5.5, )", @@ -175,11 +182,6 @@ "resolved": "8.0.0", "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, "System.Numerics.Vectors": { "type": "Transitive", "resolved": "4.4.0", @@ -216,6 +218,12 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "System.Buffers": { + "type": "Direct", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.Text.Encoding.CodePages": { "type": "Direct", "requested": "[8.0.0, )", @@ -245,11 +253,6 @@ "resolved": "8.0.0", "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, "System.Numerics.Vectors": { "type": "Transitive", "resolved": "4.4.0", @@ -283,6 +286,12 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "System.Buffers": { + "type": "Direct", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "ZstdSharp.Port": { "type": "Direct", "requested": "[0.8.1, )", @@ -303,9 +312,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", @@ -317,6 +326,12 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "System.Buffers": { + "type": "Direct", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "ZstdSharp.Port": { "type": "Direct", "requested": "[0.8.1, )", diff --git a/tests/SharpCompress.Test/packages.lock.json b/tests/SharpCompress.Test/packages.lock.json index 7e146431..d9f5c1eb 100644 --- a/tests/SharpCompress.Test/packages.lock.json +++ b/tests/SharpCompress.Test/packages.lock.json @@ -99,8 +99,8 @@ }, "System.Buffers": { "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" }, "System.Collections.Immutable": { "type": "Transitive", @@ -182,6 +182,7 @@ "type": "Project", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "[8.0.0, )", + "System.Buffers": "[4.6.0, )", "System.Memory": "[4.5.5, )", "System.Text.Encoding.CodePages": "[8.0.0, )", "ZstdSharp.Port": "[0.8.1, )" @@ -328,6 +329,11 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "4.4.0", @@ -394,6 +400,7 @@ "sharpcompress": { "type": "Project", "dependencies": { + "System.Buffers": "[4.6.0, )", "ZstdSharp.Port": "[0.8.1, )" } }, From 44998a2a2b531ca533d7b188fa6e5eaf0ebe85cb Mon Sep 17 00:00:00 2001 From: majorro Date: Sun, 12 Jan 2025 16:01:59 +0300 Subject: [PATCH 2/9] pooled window for rar unpackv1 --- src/SharpCompress/Archives/Rar/RarArchive.cs | 18 +++++++++++++-- .../Compressors/Rar/UnpackV1/Unpack.cs | 23 +++++++++++++++---- src/SharpCompress/Readers/AbstractReader.cs | 2 +- src/SharpCompress/Readers/Rar/RarReader.cs | 18 +++++++++++++-- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/SharpCompress/Archives/Rar/RarArchive.cs b/src/SharpCompress/Archives/Rar/RarArchive.cs index a05ad417..b9c1bfde 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.cs @@ -14,8 +14,8 @@ namespace SharpCompress.Archives.Rar; public class RarArchive : AbstractArchive { - internal Lazy UnpackV2017 { get; } = - new(() => new Compressors.Rar.UnpackV2017.Unpack()); + private bool _disposed; + internal Lazy UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack()); internal Lazy UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack()); /// @@ -25,6 +25,20 @@ public class RarArchive : AbstractArchive private RarArchive(SourceStream sourceStream) : base(ArchiveType.Rar, sourceStream) { } + public override void Dispose() + { + if (!_disposed) + { + if (UnpackV1.IsValueCreated && UnpackV1.Value is IDisposable unpackV1) + { + unpackV1.Dispose(); + } + + _disposed = true; + base.Dispose(); + } + } + protected override IEnumerable LoadEntries(IEnumerable volumes) => RarArchiveEntryFactory.GetEntries(this, volumes, ReaderOptions); diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs index e6d4153d..e9891d99 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs @@ -1,6 +1,7 @@ #nullable disable using System; +using System.Buffers; using System.Collections.Generic; using System.IO; using SharpCompress.Common; @@ -12,14 +13,27 @@ using SharpCompress.Compressors.Rar.VM; namespace SharpCompress.Compressors.Rar.UnpackV1; -internal sealed partial class Unpack : BitInput, IRarUnpack +internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable { private readonly BitInput Inp; + private bool disposed; public Unpack() => // to ease in porting Unpack50.cs Inp = this; + public void Dispose() + { + if (!disposed) + { + if (!externalWindow) + { + ArrayPool.Shared.Return(window); + } + disposed = true; + } + } + public bool FileExtracted { get; private set; } public long DestSize @@ -74,7 +88,7 @@ internal sealed partial class Unpack : BitInput, IRarUnpack private BlockTypes unpBlockType; - //private bool externalWindow; + private bool externalWindow; private long writtenFileSize; @@ -113,13 +127,12 @@ internal sealed partial class Unpack : BitInput, IRarUnpack { if (window is null) { - this.window = new byte[PackDef.MAXWINSIZE]; + this.window = ArrayPool.Shared.Rent(PackDef.MAXWINSIZE); } else { this.window = window; - - //externalWindow = true; + externalWindow = true; } inAddr = 0; UnpInitData(false); diff --git a/src/SharpCompress/Readers/AbstractReader.cs b/src/SharpCompress/Readers/AbstractReader.cs index b36acd53..96ac0a58 100644 --- a/src/SharpCompress/Readers/AbstractReader.cs +++ b/src/SharpCompress/Readers/AbstractReader.cs @@ -44,7 +44,7 @@ public abstract class AbstractReader : IReader, IReaderExtracti #region IDisposable Members - public void Dispose() + public virtual void Dispose() { _entriesForCurrentReadStream?.Dispose(); Volume?.Dispose(); diff --git a/src/SharpCompress/Readers/Rar/RarReader.cs b/src/SharpCompress/Readers/Rar/RarReader.cs index 2398cfac..a9078cae 100644 --- a/src/SharpCompress/Readers/Rar/RarReader.cs +++ b/src/SharpCompress/Readers/Rar/RarReader.cs @@ -13,14 +13,28 @@ namespace SharpCompress.Readers.Rar; /// public abstract class RarReader : AbstractReader { + private bool _disposed; private RarVolume? volume; - private Lazy UnpackV2017 { get; } = - new(() => new Compressors.Rar.UnpackV2017.Unpack()); + private Lazy UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack()); private Lazy UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack()); internal RarReader(ReaderOptions options) : base(options, ArchiveType.Rar) { } + public override void Dispose() + { + if (!_disposed) + { + if (UnpackV1.IsValueCreated && UnpackV1.Value is IDisposable unpackV1) + { + unpackV1.Dispose(); + } + + _disposed = true; + base.Dispose(); + } + } + protected abstract void ValidateArchive(RarVolume archive); public override RarVolume? Volume => volume; From 10e0562a82242b9c443b9454f7773828714e8713 Mon Sep 17 00:00:00 2001 From: majorro Date: Sun, 12 Jan 2025 16:02:49 +0300 Subject: [PATCH 3/9] stackalloc rar unpackv1 --- .../Compressors/Rar/UnpackV1/Unpack.cs | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs index e9891d99..be55b7bb 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs @@ -188,31 +188,24 @@ internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable private void UnstoreFile() { - var buffer = new byte[0x10000]; - while (true) + Span buffer = stackalloc byte[(int)Math.Min(0x10000, destUnpSize)]; + do { - var code = readStream.Read(buffer, 0, (int)Math.Min(buffer.Length, destUnpSize)); + var code = readStream.Read(buffer); if (code == 0 || code == -1) { break; } code = code < destUnpSize ? code : (int)destUnpSize; - writeStream.Write(buffer, 0, code); - if (destUnpSize >= 0) - { - destUnpSize -= code; - } - if (suspended) - { - return; - } - } + writeStream.Write(buffer.Slice(0, code)); + destUnpSize -= code; + } while (!suspended && destUnpSize > 0); } private void Unpack29(bool solid) { - var DDecode = new int[PackDef.DC]; - var DBits = new byte[PackDef.DC]; + Span DDecode = stackalloc int[PackDef.DC]; + Span DBits = stackalloc byte[PackDef.DC]; int Bits; From ca0a6ab72c82189fc9160330dee1cd28be2a9566 Mon Sep 17 00:00:00 2001 From: majorro Date: Sun, 12 Jan 2025 16:38:30 +0300 Subject: [PATCH 4/9] rollback ILLink.Tasks downgrade --- src/SharpCompress/packages.lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SharpCompress/packages.lock.json b/src/SharpCompress/packages.lock.json index 3e2da73d..5b33071a 100644 --- a/src/SharpCompress/packages.lock.json +++ b/src/SharpCompress/packages.lock.json @@ -312,9 +312,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "B3etT5XQ2nlWkZGO2m/ytDYrOmSsQG1XNBaM6ZYlX5Ch/tDrMFadr0/mK6gjZwaQc55g+5+WZMw4Cz3m8VEF7g==" + "requested": "[8.0.7, )", + "resolved": "8.0.7", + "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", @@ -350,4 +350,4 @@ } } } -} \ No newline at end of file +} From a070493fbab0fe75e397e75bf7c0fd3ff18b75ed Mon Sep 17 00:00:00 2001 From: majorro Date: Mon, 13 Jan 2025 23:26:49 +0300 Subject: [PATCH 5/9] window null checks --- src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs index be55b7bb..6cadcede 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs @@ -29,6 +29,7 @@ internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable if (!externalWindow) { ArrayPool.Shared.Return(window); + window = null; } disposed = true; } @@ -125,11 +126,11 @@ internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable private void Init(byte[] window) { - if (window is null) + if (this.window is null && window is null) { this.window = ArrayPool.Shared.Rent(PackDef.MAXWINSIZE); } - else + else if (window is not null) { this.window = window; externalWindow = true; From 91364c6a7ca50d1fee2c4bb8ed34fed66449a499 Mon Sep 17 00:00:00 2001 From: majorro Date: Mon, 13 Jan 2025 23:28:26 +0300 Subject: [PATCH 6/9] stackalloc readtables --- src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs | 6 +++--- src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs | 8 +++----- .../Compressors/Rar/UnpackV1/UnpackUtility.cs | 5 ++--- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs index 6cadcede..1af0965c 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs @@ -866,9 +866,9 @@ internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable private bool ReadTables() { - var bitLength = new byte[PackDef.BC]; + Span bitLength = stackalloc byte[PackDef.BC]; + Span table = stackalloc byte[PackDef.HUFF_TABLE_SIZE]; - var table = new byte[PackDef.HUFF_TABLE_SIZE]; if (inAddr > readTop - 25) { if (!unpReadBuf()) @@ -996,7 +996,7 @@ internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable // memcpy(unpOldTable,table,sizeof(unpOldTable)); - Buffer.BlockCopy(table, 0, unpOldTable, 0, unpOldTable.Length); + table.CopyTo(unpOldTable); return (true); } diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs index 3a5d008d..33900961 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs @@ -391,11 +391,9 @@ internal partial class Unpack private bool ReadTables20() { - var BitLength = new byte[PackDef.BC20]; - var Table = new byte[PackDef.MC20 * 4]; - int TableSize, - N, - I; + Span BitLength = stackalloc byte[PackDef.BC20]; + Span Table = stackalloc byte[PackDef.MC20 * 4]; + int TableSize, N, I; if (inAddr > readTop - 25) { if (!unpReadBuf()) diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs index b501337b..c388cdcb 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs @@ -181,13 +181,12 @@ internal static class UnpackUtility return (dec.DecodeNum[N]); } - internal static void makeDecodeTables(byte[] lenTab, int offset, Decode.Decode dec, int size) + internal static void makeDecodeTables(Span lenTab, int offset, Decode.Decode dec, int size) { Span lenCount = stackalloc int[16]; Span tmpPos = stackalloc int[16]; int i; - long M, - N; + long M, N; new Span(dec.DecodeNum).Clear(); // memset(Dec->DecodeNum,0,Size*sizeof(*Dec->DecodeNum)); From 23e1447ab63ca8ccfb8fbc867e086f369bf1d0a1 Mon Sep 17 00:00:00 2001 From: majorro Date: Mon, 13 Jan 2025 23:31:33 +0300 Subject: [PATCH 7/9] stackalloc addvmcode --- src/SharpCompress/Compressors/Rar/RarCRC.cs | 2 +- src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs | 2 +- src/SharpCompress/Compressors/Rar/VM/RarVM.cs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SharpCompress/Compressors/Rar/RarCRC.cs b/src/SharpCompress/Compressors/Rar/RarCRC.cs index 8f4fb47e..7e6fc6cc 100644 --- a/src/SharpCompress/Compressors/Rar/RarCRC.cs +++ b/src/SharpCompress/Compressors/Rar/RarCRC.cs @@ -9,7 +9,7 @@ internal static class RarCRC public static uint CheckCrc(uint startCrc, byte b) => (crcTab[((int)startCrc ^ b) & 0xff] ^ (startCrc >> 8)); - public static uint CheckCrc(uint startCrc, byte[] data, int offset, int count) + public static uint CheckCrc(uint startCrc, ReadOnlySpan data, int offset, int count) { var size = Math.Min(data.Length - offset, count); diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs index 1af0965c..eb2ddea6 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack.cs @@ -1197,7 +1197,7 @@ internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable { return (false); } - var VMCode = new byte[VMCodeSize]; + Span VMCode = stackalloc byte[VMCodeSize]; for (var I = 0; I < VMCodeSize; I++) { if (Inp.Overflow(3)) diff --git a/src/SharpCompress/Compressors/Rar/VM/RarVM.cs b/src/SharpCompress/Compressors/Rar/VM/RarVM.cs index f758b8a4..0dd3e326 100644 --- a/src/SharpCompress/Compressors/Rar/VM/RarVM.cs +++ b/src/SharpCompress/Compressors/Rar/VM/RarVM.cs @@ -776,14 +776,14 @@ internal sealed class RarVM : BitInput } } - public void prepare(byte[] code, int codeSize, VMPreparedProgram prg) + public void prepare(ReadOnlySpan code, int codeSize, VMPreparedProgram prg) { InitBitInput(); var cpLength = Math.Min(MAX_SIZE, codeSize); // memcpy(inBuf,Code,Min(CodeSize,BitInput::MAX_SIZE)); - Buffer.BlockCopy(code, 0, InBuf, 0, cpLength); + code.Slice(0, cpLength).CopyTo(InBuf); byte xorSum = 0; for (var i = 1; i < codeSize; i++) { @@ -1105,7 +1105,7 @@ internal sealed class RarVM : BitInput } } - private VMStandardFilters IsStandardFilter(byte[] code, int codeSize) + private VMStandardFilters IsStandardFilter(ReadOnlySpan code, int codeSize) { VMStandardFilterSignature[] stdList = { From 3875f624537d0481cf024adaf8956c489452cebe Mon Sep 17 00:00:00 2001 From: majorro Date: Tue, 14 Jan 2025 00:36:26 +0300 Subject: [PATCH 8/9] deps fix --- tests/SharpCompress.Test/packages.lock.json | 22 +++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tests/SharpCompress.Test/packages.lock.json b/tests/SharpCompress.Test/packages.lock.json index d9f5c1eb..94f193fc 100644 --- a/tests/SharpCompress.Test/packages.lock.json +++ b/tests/SharpCompress.Test/packages.lock.json @@ -97,11 +97,6 @@ "System.Reflection.Metadata": "1.6.0" } }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.6.0", - "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" - }, "System.Collections.Immutable": { "type": "Transitive", "resolved": "1.5.0", @@ -197,6 +192,12 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "System.Buffers": { + "type": "CentralTransitive", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.Memory": { "type": "CentralTransitive", "requested": "[4.5.5, )", @@ -329,11 +330,6 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.6.0", - "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" - }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "4.4.0", @@ -404,6 +400,12 @@ "ZstdSharp.Port": "[0.8.1, )" } }, + "System.Buffers": { + "type": "CentralTransitive", + "requested": "[4.6.0, )", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "ZstdSharp.Port": { "type": "CentralTransitive", "requested": "[0.8.1, )", From a89fc3a276b992737567defc210bbd2832f50f7c Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 14 Jan 2025 08:55:09 +0000 Subject: [PATCH 9/9] formatting --- src/SharpCompress/Archives/Rar/RarArchive.cs | 3 ++- src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs | 4 +++- .../Compressors/Rar/UnpackV1/UnpackUtility.cs | 10 ++++++++-- src/SharpCompress/Readers/Rar/RarReader.cs | 3 ++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/SharpCompress/Archives/Rar/RarArchive.cs b/src/SharpCompress/Archives/Rar/RarArchive.cs index b9c1bfde..6a5c9781 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.cs @@ -15,7 +15,8 @@ namespace SharpCompress.Archives.Rar; public class RarArchive : AbstractArchive { private bool _disposed; - internal Lazy UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack()); + internal Lazy UnpackV2017 { get; } = + new(() => new Compressors.Rar.UnpackV2017.Unpack()); internal Lazy UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack()); /// diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs index 33900961..e4069c76 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/Unpack20.cs @@ -393,7 +393,9 @@ internal partial class Unpack { Span BitLength = stackalloc byte[PackDef.BC20]; Span Table = stackalloc byte[PackDef.MC20 * 4]; - int TableSize, N, I; + int TableSize, + N, + I; if (inAddr > readTop - 25) { if (!unpReadBuf()) diff --git a/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs b/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs index c388cdcb..4b16e43d 100644 --- a/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs +++ b/src/SharpCompress/Compressors/Rar/UnpackV1/UnpackUtility.cs @@ -181,12 +181,18 @@ internal static class UnpackUtility return (dec.DecodeNum[N]); } - internal static void makeDecodeTables(Span lenTab, int offset, Decode.Decode dec, int size) + internal static void makeDecodeTables( + Span lenTab, + int offset, + Decode.Decode dec, + int size + ) { Span lenCount = stackalloc int[16]; Span tmpPos = stackalloc int[16]; int i; - long M, N; + long M, + N; new Span(dec.DecodeNum).Clear(); // memset(Dec->DecodeNum,0,Size*sizeof(*Dec->DecodeNum)); diff --git a/src/SharpCompress/Readers/Rar/RarReader.cs b/src/SharpCompress/Readers/Rar/RarReader.cs index a9078cae..184ba62d 100644 --- a/src/SharpCompress/Readers/Rar/RarReader.cs +++ b/src/SharpCompress/Readers/Rar/RarReader.cs @@ -15,7 +15,8 @@ public abstract class RarReader : AbstractReader { private bool _disposed; private RarVolume? volume; - private Lazy UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack()); + private Lazy UnpackV2017 { get; } = + new(() => new Compressors.Rar.UnpackV2017.Unpack()); private Lazy UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack()); internal RarReader(ReaderOptions options)