diff --git a/src/AsmResolver.DotNet/Signatures/BlobSerializationContext.cs b/src/AsmResolver.DotNet/Signatures/BlobSerializationContext.cs index bbe68c8ee..d53819ff3 100644 --- a/src/AsmResolver.DotNet/Signatures/BlobSerializationContext.cs +++ b/src/AsmResolver.DotNet/Signatures/BlobSerializationContext.cs @@ -6,7 +6,7 @@ namespace AsmResolver.DotNet.Signatures /// /// Describes a context in which a blob signature is to be serialized in. /// - public class BlobSerializationContext + public readonly struct BlobSerializationContext { /// /// Creates a new instance of the class. diff --git a/src/AsmResolver.DotNet/Signatures/BlobSignature.cs b/src/AsmResolver.DotNet/Signatures/BlobSignature.cs index 17ac56302..d42c16bcd 100644 --- a/src/AsmResolver.DotNet/Signatures/BlobSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/BlobSignature.cs @@ -8,7 +8,7 @@ public abstract class BlobSignature /// /// Serializes the blob to an output stream. /// - public abstract void Write(BlobSerializationContext context); + public abstract void Write(in BlobSerializationContext context); /// /// Wraps the blob signature into a new stand-alone signature that can be referenced by a metadata token. diff --git a/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentWriter.cs b/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentWriter.cs index 71049ab4b..a0319b23d 100644 --- a/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentWriter.cs +++ b/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentWriter.cs @@ -7,13 +7,13 @@ namespace AsmResolver.DotNet.Signatures { - internal sealed class CustomAttributeArgumentWriter + internal readonly struct CustomAttributeArgumentWriter { private readonly BlobSerializationContext _context; public CustomAttributeArgumentWriter(BlobSerializationContext context) { - _context = context ?? throw new ArgumentNullException(nameof(context)); + _context = context; } public void WriteArgument(CustomAttributeArgument argument) diff --git a/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs b/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs index 3cb564c0c..8e645704a 100644 --- a/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs @@ -144,7 +144,7 @@ public override string ToString() } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteUInt16(CustomAttributeSignaturePrologue); diff --git a/src/AsmResolver.DotNet/Signatures/DataBlobSignature.cs b/src/AsmResolver.DotNet/Signatures/DataBlobSignature.cs index 062d07a0d..8dee782cd 100644 --- a/src/AsmResolver.DotNet/Signatures/DataBlobSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/DataBlobSignature.cs @@ -65,7 +65,7 @@ public object InterpretData(ElementType elementType) } /// - public override void Write(BlobSerializationContext context) => context.Writer.WriteBytes(Data); + public override void Write(in BlobSerializationContext context) => context.Writer.WriteBytes(Data); /// /// Create a from a value diff --git a/src/AsmResolver.DotNet/Signatures/ExtendableBlobSignature.cs b/src/AsmResolver.DotNet/Signatures/ExtendableBlobSignature.cs index d19e4f9ae..10256d7a2 100644 --- a/src/AsmResolver.DotNet/Signatures/ExtendableBlobSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/ExtendableBlobSignature.cs @@ -17,7 +17,7 @@ public byte[]? ExtraData } /// - public sealed override void Write(BlobSerializationContext context) + public sealed override void Write(in BlobSerializationContext context) { WriteContents(context); if (ExtraData is not null) @@ -27,6 +27,6 @@ public sealed override void Write(BlobSerializationContext context) /// /// Serializes the blob (without extra data) to an output stream. /// - protected abstract void WriteContents(BlobSerializationContext context); + protected abstract void WriteContents(in BlobSerializationContext context); } } diff --git a/src/AsmResolver.DotNet/Signatures/FieldSignature.cs b/src/AsmResolver.DotNet/Signatures/FieldSignature.cs index 02b5495f4..f1d69e005 100644 --- a/src/AsmResolver.DotNet/Signatures/FieldSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/FieldSignature.cs @@ -89,7 +89,7 @@ public FieldSignature InstantiateGenericTypes(GenericContext context) => GenericTypeActivator.Instance.InstantiateFieldSignature(this, context); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteByte((byte) Attributes); FieldType.Write(context); diff --git a/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs b/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs index 291a07c25..33848a34d 100644 --- a/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs @@ -93,7 +93,7 @@ public IList TypeArguments } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; writer.WriteByte((byte) Attributes); diff --git a/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs b/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs index 2376fd95c..165e68558 100644 --- a/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs @@ -93,7 +93,7 @@ protected override CallingConventionSignature ImportWithInternal(ReferenceImport ImportWith(importer); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/ComInterfaceMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/ComInterfaceMarshalDescriptor.cs index c053be78c..96e60cbc5 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/ComInterfaceMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/ComInterfaceMarshalDescriptor.cs @@ -58,7 +58,7 @@ public int? IidParameterIndex } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/CustomMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/CustomMarshalDescriptor.cs index 4376c82de..cdea0bda6 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/CustomMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/CustomMarshalDescriptor.cs @@ -87,7 +87,7 @@ public Utf8String? Cookie } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/FixedArrayMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/FixedArrayMarshalDescriptor.cs index 6f9401a32..0e0e8cd98 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/FixedArrayMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/FixedArrayMarshalDescriptor.cs @@ -76,7 +76,7 @@ public NativeType? ArrayElementType } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/FixedSysStringMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/FixedSysStringMarshalDescriptor.cs index b41cd42cf..cbdf77aec 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/FixedSysStringMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/FixedSysStringMarshalDescriptor.cs @@ -41,7 +41,7 @@ public int Size } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/LPArrayMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/LPArrayMarshalDescriptor.cs index 58f98f65a..7346b3616 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/LPArrayMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/LPArrayMarshalDescriptor.cs @@ -83,7 +83,7 @@ public LPArrayFlags? Flags } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/SafeArrayMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/SafeArrayMarshalDescriptor.cs index 0b4323254..85e2e2a8f 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/SafeArrayMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/SafeArrayMarshalDescriptor.cs @@ -135,7 +135,7 @@ public TypeSignature? UserDefinedSubType } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Marshal/SimpleMarshalDescriptor.cs b/src/AsmResolver.DotNet/Signatures/Marshal/SimpleMarshalDescriptor.cs index 81b5a4d34..e4f282186 100644 --- a/src/AsmResolver.DotNet/Signatures/Marshal/SimpleMarshalDescriptor.cs +++ b/src/AsmResolver.DotNet/Signatures/Marshal/SimpleMarshalDescriptor.cs @@ -21,7 +21,7 @@ public override NativeType NativeType } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteByte((byte) NativeType); } diff --git a/src/AsmResolver.DotNet/Signatures/MethodSignature.cs b/src/AsmResolver.DotNet/Signatures/MethodSignature.cs index 818452aa6..3600c6e32 100644 --- a/src/AsmResolver.DotNet/Signatures/MethodSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/MethodSignature.cs @@ -201,7 +201,7 @@ public MethodSignature InstantiateGenericTypes(GenericContext context) public FunctionPointerTypeSignature MakeFunctionPointerType() => new(this); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/PropertySignature.cs b/src/AsmResolver.DotNet/Signatures/PropertySignature.cs index 5883cad30..15b01e0d1 100644 --- a/src/AsmResolver.DotNet/Signatures/PropertySignature.cs +++ b/src/AsmResolver.DotNet/Signatures/PropertySignature.cs @@ -112,7 +112,7 @@ public PropertySignature InstantiateGenericTypes(GenericContext context) => GenericTypeActivator.Instance.InstantiatePropertySignature(this, context); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteByte((byte) Attributes); WriteParametersAndReturnType(context); diff --git a/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs b/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs index 8ecf7e4f2..347365357 100644 --- a/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs @@ -38,7 +38,7 @@ public IList Attributes } = new List(); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs b/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs index e1a6bc9de..3a841170a 100644 --- a/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs @@ -53,7 +53,7 @@ protected override void Initialize( } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { // If the arguments are not initialized yet, it means nobody accessed the fixed or named arguments of the // signature. In such a case, we can safely assume nothing has changed to the signature. diff --git a/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs index e81140d88..081ec88e2 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs @@ -201,7 +201,7 @@ public override TResult AcceptVisitor(ITypeSignatureVisitor - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { if (!Validate()) throw new InvalidOperationException(); diff --git a/src/AsmResolver.DotNet/Signatures/Types/CorLibTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/CorLibTypeSignature.cs index ae2a6974c..9f77eaba4 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/CorLibTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/CorLibTypeSignature.cs @@ -103,7 +103,7 @@ public override IResolutionScope? Scope public override ITypeDefOrRef ToTypeDefOrRef() => Type; /// - protected override void WriteContents(BlobSerializationContext context) => + protected override void WriteContents(in BlobSerializationContext context) => context.Writer.WriteByte((byte) ElementType); /// diff --git a/src/AsmResolver.DotNet/Signatures/Types/CustomModifierTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/CustomModifierTypeSignature.cs index 64ec085e1..12b4554ad 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/CustomModifierTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/CustomModifierTypeSignature.cs @@ -80,7 +80,7 @@ public override bool IsImportedInModule(ModuleDefinition module) => ModifierType.IsImportedInModule(module) && base.IsImportedInModule(module); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteByte((byte) ElementType); WriteTypeDefOrRef(context, ModifierType, "Modifier type"); diff --git a/src/AsmResolver.DotNet/Signatures/Types/FunctionPointerTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/FunctionPointerTypeSignature.cs index 1fe273fa5..b5ebe0c15 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/FunctionPointerTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/FunctionPointerTypeSignature.cs @@ -53,7 +53,7 @@ public MethodSignature Signature public override bool IsImportedInModule(ModuleDefinition module) => Signature.IsImportedInModule(module); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteByte((byte) ElementType); Signature.Write(context); diff --git a/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs index 53a414283..33d588a03 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs @@ -127,7 +127,7 @@ public override bool IsImportedInModule(ModuleDefinition module) } /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; diff --git a/src/AsmResolver.DotNet/Signatures/Types/GenericParameterSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/GenericParameterSignature.cs index 24f487016..f29083c29 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/GenericParameterSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/GenericParameterSignature.cs @@ -90,7 +90,7 @@ public override IResolutionScope? Scope public override ITypeDefOrRef? GetUnderlyingTypeDefOrRef() => null; /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; writer.WriteByte((byte) ElementType); diff --git a/src/AsmResolver.DotNet/Signatures/Types/SentinelTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/SentinelTypeSignature.cs index 49e7faa18..cf0e8e976 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/SentinelTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/SentinelTypeSignature.cs @@ -37,7 +37,7 @@ public class SentinelTypeSignature : TypeSignature public override bool IsImportedInModule(ModuleDefinition module) => true; /// - protected override void WriteContents(BlobSerializationContext context) => + protected override void WriteContents(in BlobSerializationContext context) => context.Writer.WriteByte((byte) ElementType); /// diff --git a/src/AsmResolver.DotNet/Signatures/Types/TypeDefOrRefSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/TypeDefOrRefSignature.cs index f617beb31..3fed04061 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/TypeDefOrRefSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/TypeDefOrRefSignature.cs @@ -83,7 +83,7 @@ public override TResult AcceptVisitor(ITypeSignatureVisitor - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { var writer = context.Writer; writer.WriteByte((byte) ElementType); diff --git a/src/AsmResolver.DotNet/Signatures/Types/TypeSpecificationSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/TypeSpecificationSignature.cs index 412964357..81ced7a33 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/TypeSpecificationSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/TypeSpecificationSignature.cs @@ -44,7 +44,7 @@ public TypeSignature BaseType public override bool IsImportedInModule(ModuleDefinition module) => BaseType.IsImportedInModule(module); /// - protected override void WriteContents(BlobSerializationContext context) + protected override void WriteContents(in BlobSerializationContext context) { context.Writer.WriteByte((byte) ElementType); WriteBaseType(context); diff --git a/test/AsmResolver.DotNet.Tests/ModuleDefinitionTest.cs b/test/AsmResolver.DotNet.Tests/ModuleDefinitionTest.cs index cfae099e9..e6eed8351 100644 --- a/test/AsmResolver.DotNet.Tests/ModuleDefinitionTest.cs +++ b/test/AsmResolver.DotNet.Tests/ModuleDefinitionTest.cs @@ -4,14 +4,9 @@ using System.Linq; using System.Reflection; using System.Runtime.InteropServices; -using AsmResolver.DotNet.Builder; -using AsmResolver.DotNet.Cloning; -using AsmResolver.DotNet.Serialized; using AsmResolver.DotNet.Signatures; using AsmResolver.DotNet.TestCases.NestedClasses; using AsmResolver.IO; -using AsmResolver.PE.DotNet.Builder; -using AsmResolver.PE.DotNet.Metadata.Strings; using AsmResolver.PE.DotNet.Metadata.Tables; using AsmResolver.PE.Win32Resources; using Xunit;