From 50f81cc889999c2cee7634a72d547eeecd3516b7 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sat, 16 Mar 2024 16:21:23 +0100 Subject: [PATCH] Skip locals init. --- .../MaterialPreview/LiveColorTablePreviewer.cs | 1 + .../ResolveContext.PathResolution.cs | 4 +++- .../Interop/ResourceTree/ResolveContext.cs | 1 + Penumbra/Mods/Editor/DuplicateManager.cs | 18 +++++++++--------- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs index 801c3bf0..a8e4ea4d 100644 --- a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs +++ b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs @@ -62,6 +62,7 @@ public sealed unsafe class LiveColorTablePreviewer : LiveMaterialPreviewerBase _updatePending = true; } + [SkipLocalsInit] private void OnFrameworkUpdate(IFramework _) { if (!_updatePending) diff --git a/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs b/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs index cf939292..d5b4fa39 100644 --- a/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs +++ b/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs @@ -89,6 +89,7 @@ internal partial record ResolveContext }; } + [SkipLocalsInit] private unsafe Utf8GamePath ResolveEquipmentMaterialPath(Utf8GamePath modelPath, ResourceHandle* imc, byte* mtrlFileName) { var variant = ResolveMaterialVariant(imc, Equipment.Variant); @@ -100,6 +101,7 @@ internal partial record ResolveContext return Utf8GamePath.FromSpan(pathBuffer, out var path) ? path.Clone() : Utf8GamePath.Empty; } + [SkipLocalsInit] private unsafe Utf8GamePath ResolveWeaponMaterialPath(Utf8GamePath modelPath, ResourceHandle* imc, byte* mtrlFileName) { var setIdHigh = Equipment.Set.Id / 100; @@ -168,7 +170,7 @@ internal partial record ResolveContext { var modelPosition = modelPath.IndexOf("/model/"u8); if (modelPosition < 0) - return Span.Empty; + return []; var baseDirectory = modelPath[..modelPosition]; diff --git a/Penumbra/Interop/ResourceTree/ResolveContext.cs b/Penumbra/Interop/ResourceTree/ResolveContext.cs index 0637cba6..d1701f47 100644 --- a/Penumbra/Interop/ResourceTree/ResolveContext.cs +++ b/Penumbra/Interop/ResourceTree/ResolveContext.cs @@ -54,6 +54,7 @@ internal unsafe partial record ResolveContext( return GetOrCreateNode(ResourceType.Shpk, (nint)resourceHandle->ShaderPackage, &resourceHandle->ResourceHandle, path); } + [SkipLocalsInit] private ResourceNode? CreateNodeFromTex(TextureResourceHandle* resourceHandle, ByteString gamePath, bool dx11) { if (resourceHandle == null) diff --git a/Penumbra/Mods/Editor/DuplicateManager.cs b/Penumbra/Mods/Editor/DuplicateManager.cs index dad05102..77d10cc4 100644 --- a/Penumbra/Mods/Editor/DuplicateManager.cs +++ b/Penumbra/Mods/Editor/DuplicateManager.cs @@ -7,8 +7,8 @@ namespace Penumbra.Mods.Editor; public class DuplicateManager(ModManager modManager, SaveService saveService, Configuration config) { - private readonly SHA256 _hasher = SHA256.Create(); - private readonly List<(FullPath[] Paths, long Size, byte[] Hash)> _duplicates = []; + private readonly SHA256 _hasher = SHA256.Create(); + private readonly List<(FullPath[] Paths, long Size, byte[] Hash)> _duplicates = []; public IReadOnlyList<(FullPath[] Paths, long Size, byte[] Hash)> Duplicates => _duplicates; @@ -164,17 +164,17 @@ public class DuplicateManager(ModManager modManager, SaveService saveService, Co } /// Check if two files are identical on a binary level. Returns true if they are identical. + [SkipLocalsInit] public static unsafe bool CompareFilesDirectly(FullPath f1, FullPath f2) { + const int size = 256; if (!f1.Exists || !f2.Exists) return false; - using var s1 = File.OpenRead(f1.FullName); - using var s2 = File.OpenRead(f2.FullName); - var buffer1 = stackalloc byte[256]; - var buffer2 = stackalloc byte[256]; - var span1 = new Span(buffer1, 256); - var span2 = new Span(buffer2, 256); + using var s1 = File.OpenRead(f1.FullName); + using var s2 = File.OpenRead(f2.FullName); + Span span1 = stackalloc byte[size]; + Span span2 = stackalloc byte[size]; while (true) { @@ -186,7 +186,7 @@ public class DuplicateManager(ModManager modManager, SaveService saveService, Co if (!span1[..bytes1].SequenceEqual(span2[..bytes2])) return false; - if (bytes1 < 256) + if (bytes1 < size) return true; } }