From 983873b46108c5290c6e9282ba7b386faf287665 Mon Sep 17 00:00:00 2001 From: Washi Date: Sun, 27 Nov 2022 13:46:04 +0100 Subject: [PATCH] Rename BlobReadContext -> BlobReaderContext. --- .../DynamicCilOperandResolver.cs | 3 +- .../DynamicMethodHelper.cs | 4 +- .../DynamicTypeSignatureReader.cs | 2 +- .../Serialized/SerializedCustomAttribute.cs | 2 +- .../Serialized/SerializedFieldDefinition.cs | 2 +- .../Serialized/SerializedMemberReference.cs | 2 +- .../Serialized/SerializedMethodDefinition.cs | 2 +- .../SerializedMethodSpecification.cs | 2 +- .../SerializedPropertyDefinition.cs | 2 +- .../SerializedSecurityDeclaration.cs | 2 +- .../SerializedStandAloneSignature.cs | 2 +- .../Serialized/SerializedTypeSpecification.cs | 2 +- ...lobReadContext.cs => BlobReaderContext.cs} | 52 +++++++++++-------- .../Signatures/CallingConventionSignature.cs | 4 +- .../Signatures/CustomAttributeArgument.cs | 2 +- .../CustomAttributeArgumentReader.cs | 2 +- .../CustomAttributeNamedArgument.cs | 2 +- .../Signatures/CustomAttributeSignature.cs | 2 +- .../Signatures/FieldSignature.cs | 2 +- .../GenericInstanceMethodSignature.cs | 2 +- .../Signatures/LocalVariablesSignature.cs | 2 +- .../Signatures/MethodSignature.cs | 2 +- .../Signatures/MethodSignatureBase.cs | 2 +- .../Signatures/PropertySignature.cs | 2 +- .../Security/PermissionSetSignature.cs | 2 +- .../Signatures/Security/SecurityAttribute.cs | 2 +- .../SerializedCustomAttributeSignature.cs | 4 +- .../Signatures/Types/ArrayTypeSignature.cs | 2 +- .../Types/GenericInstanceTypeSignature.cs | 2 +- .../Types/ITypeSignatureResolver.cs | 4 +- .../Types/PhysicalTypeSignatureResolver.cs | 7 ++- .../Signatures/Types/TypeSignature.cs | 6 +-- 32 files changed, 72 insertions(+), 60 deletions(-) rename src/AsmResolver.DotNet/Signatures/{BlobReadContext.cs => BlobReaderContext.cs} (55%) diff --git a/src/AsmResolver.DotNet.Dynamic/DynamicCilOperandResolver.cs b/src/AsmResolver.DotNet.Dynamic/DynamicCilOperandResolver.cs index 3efbe83d1..8f4b202f4 100644 --- a/src/AsmResolver.DotNet.Dynamic/DynamicCilOperandResolver.cs +++ b/src/AsmResolver.DotNet.Dynamic/DynamicCilOperandResolver.cs @@ -96,7 +96,8 @@ public DynamicCilOperandResolver(SerializedModuleDefinition contextModule, CilMe case TableIndex.StandAloneSig: var reader = new BinaryStreamReader((byte[])_tokens[(int)token.Rid]!); - return CallingConventionSignature.FromReader(new BlobReadContext(_readerContext), ref reader); + var blobReadContext = new BlobReaderContext(_readerContext); + return CallingConventionSignature.FromReader(ref blobReadContext, ref reader); } return token; diff --git a/src/AsmResolver.DotNet.Dynamic/DynamicMethodHelper.cs b/src/AsmResolver.DotNet.Dynamic/DynamicMethodHelper.cs index 3563096b6..27e3d27c3 100644 --- a/src/AsmResolver.DotNet.Dynamic/DynamicMethodHelper.cs +++ b/src/AsmResolver.DotNet.Dynamic/DynamicMethodHelper.cs @@ -19,8 +19,8 @@ public static void ReadLocalVariables(CilMethodBody methodBody, MethodDefinition throw new ArgumentException("Method body should reference a serialized module."); var reader = new BinaryStreamReader(localSig); - var context = new BlobReadContext(module.ReaderContext, DynamicTypeSignatureResolver.Instance); - if (CallingConventionSignature.FromReader(context, ref reader) + var context = new BlobReaderContext(module.ReaderContext, DynamicTypeSignatureResolver.Instance); + if (CallingConventionSignature.FromReader(ref context, ref reader) is not LocalVariablesSignature localsSignature) { throw new ArgumentException("Invalid local variables signature."); diff --git a/src/AsmResolver.DotNet.Dynamic/DynamicTypeSignatureReader.cs b/src/AsmResolver.DotNet.Dynamic/DynamicTypeSignatureReader.cs index 9ebb00448..876ae9f4c 100644 --- a/src/AsmResolver.DotNet.Dynamic/DynamicTypeSignatureReader.cs +++ b/src/AsmResolver.DotNet.Dynamic/DynamicTypeSignatureReader.cs @@ -41,7 +41,7 @@ static DynamicTypeSignatureResolver() public static bool IsSupported => GetTypeFromHandleUnsafeMethod is not null; /// - public override TypeSignature ResolveRuntimeType(ref BlobReadContext context, nint address) + public override TypeSignature ResolveRuntimeType(ref BlobReaderContext context, nint address) { if (!IsSupported) throw new PlatformNotSupportedException("The current platform does not support the translation of raw type handles to System.Type instances."); diff --git a/src/AsmResolver.DotNet/Serialized/SerializedCustomAttribute.cs b/src/AsmResolver.DotNet/Serialized/SerializedCustomAttribute.cs index 9809a0516..6b334c1b4 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedCustomAttribute.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedCustomAttribute.cs @@ -64,7 +64,7 @@ public SerializedCustomAttribute(ModuleReaderContext context, MetadataToken toke $"Invalid signature blob index in custom attribute {MetadataToken}."); } - return CustomAttributeSignature.FromReader(new BlobReadContext(_context), Constructor, reader); + return CustomAttributeSignature.FromReader(new BlobReaderContext(_context), Constructor, reader); } } } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedFieldDefinition.cs b/src/AsmResolver.DotNet/Serialized/SerializedFieldDefinition.cs index 9af8ed262..768f687fd 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedFieldDefinition.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedFieldDefinition.cs @@ -47,7 +47,7 @@ public SerializedFieldDefinition(ModuleReaderContext context, MetadataToken toke $"Invalid signature blob index in field {MetadataToken.ToString()}."); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); return FieldSignature.FromReader(ref context, ref reader); } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedMemberReference.cs b/src/AsmResolver.DotNet/Serialized/SerializedMemberReference.cs index 0064bfc53..e1250020c 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedMemberReference.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedMemberReference.cs @@ -60,7 +60,7 @@ public SerializedMemberReference( $"Invalid signature blob index in member reference {MetadataToken.ToString()}."); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); return CallingConventionSignature.FromReader(ref context, ref reader, true); } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedMethodDefinition.cs b/src/AsmResolver.DotNet/Serialized/SerializedMethodDefinition.cs index 4c55e60c1..42675f8ab 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedMethodDefinition.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedMethodDefinition.cs @@ -52,7 +52,7 @@ public SerializedMethodDefinition(ModuleReaderContext context, MetadataToken tok $"Invalid signature blob index in method {MetadataToken.ToString()}."); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); return MethodSignature.FromReader(ref context, ref reader); } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedMethodSpecification.cs b/src/AsmResolver.DotNet/Serialized/SerializedMethodSpecification.cs index 0f8b7e3b6..7878db964 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedMethodSpecification.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedMethodSpecification.cs @@ -52,7 +52,7 @@ public SerializedMethodSpecification(ModuleReaderContext context, MetadataToken $"Invalid instantiation blob index in method specification {MetadataToken.ToString()}."); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); return GenericInstanceMethodSignature.FromReader(ref context, ref reader); } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedPropertyDefinition.cs b/src/AsmResolver.DotNet/Serialized/SerializedPropertyDefinition.cs index 5f051e158..1d235e66a 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedPropertyDefinition.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedPropertyDefinition.cs @@ -48,7 +48,7 @@ public SerializedPropertyDefinition(ModuleReaderContext context, MetadataToken t $"Invalid signature blob index in property {MetadataToken.ToString()}."); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); return PropertySignature.FromReader(ref context, ref reader); } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedSecurityDeclaration.cs b/src/AsmResolver.DotNet/Serialized/SerializedSecurityDeclaration.cs index c39273a75..a6dd50fd9 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedSecurityDeclaration.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedSecurityDeclaration.cs @@ -56,7 +56,7 @@ public SerializedSecurityDeclaration( $"Invalid permission set blob index in security declaration {MetadataToken.ToString()}."); } - return PermissionSetSignature.FromReader(new BlobReadContext(_context), ref reader); + return PermissionSetSignature.FromReader(new BlobReaderContext(_context), ref reader); } } } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedStandAloneSignature.cs b/src/AsmResolver.DotNet/Serialized/SerializedStandAloneSignature.cs index e65329632..65e82da76 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedStandAloneSignature.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedStandAloneSignature.cs @@ -43,7 +43,7 @@ public SerializedStandAloneSignature( $"Invalid signature blob index in stand-alone signature {MetadataToken.ToString()}."); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); return CallingConventionSignature.FromReader(ref context, ref reader); } diff --git a/src/AsmResolver.DotNet/Serialized/SerializedTypeSpecification.cs b/src/AsmResolver.DotNet/Serialized/SerializedTypeSpecification.cs index 50107bbc0..4f05ed1ba 100644 --- a/src/AsmResolver.DotNet/Serialized/SerializedTypeSpecification.cs +++ b/src/AsmResolver.DotNet/Serialized/SerializedTypeSpecification.cs @@ -41,7 +41,7 @@ public SerializedTypeSpecification(ModuleReaderContext context, MetadataToken to $"Invalid blob signature for type specification {MetadataToken.ToString()}"); } - var context = new BlobReadContext(_context); + var context = new BlobReaderContext(_context); context.StepInToken(MetadataToken); return TypeSignature.FromReader(ref context, ref reader); } diff --git a/src/AsmResolver.DotNet/Signatures/BlobReadContext.cs b/src/AsmResolver.DotNet/Signatures/BlobReaderContext.cs similarity index 55% rename from src/AsmResolver.DotNet/Signatures/BlobReadContext.cs rename to src/AsmResolver.DotNet/Signatures/BlobReaderContext.cs index f95f1f94f..b9395871a 100644 --- a/src/AsmResolver.DotNet/Signatures/BlobReadContext.cs +++ b/src/AsmResolver.DotNet/Signatures/BlobReaderContext.cs @@ -1,5 +1,5 @@ +using System; using System.Collections.Generic; -using System.Linq; using AsmResolver.DotNet.Serialized; using AsmResolver.DotNet.Signatures.Types; using AsmResolver.PE.DotNet.Metadata.Tables; @@ -10,44 +10,31 @@ namespace AsmResolver.DotNet.Signatures /// Provides a context in which a metadata blob parser exists in. This includes the original module reader context /// as well as a mechanism to protect against infinite recursion. /// - public struct BlobReadContext + public struct BlobReaderContext { private Stack? _traversedTokens; /// - /// Creates a new instance of the structure. + /// Creates a new instance of the structure. /// /// The original read context. - public BlobReadContext(ModuleReaderContext readerContext) + public BlobReaderContext(ModuleReaderContext readerContext) : this(readerContext, PhysicalTypeSignatureResolver.Instance) { } /// - /// Creates a new instance of the structure. + /// Creates a new instance of the structure. /// /// The original read context. /// The object responsible for resolving raw type metadata tokens and addresses. - public BlobReadContext(ModuleReaderContext readerContext, ITypeSignatureResolver resolver) + public BlobReaderContext(ModuleReaderContext readerContext, ITypeSignatureResolver resolver) { ReaderContext = readerContext; TypeSignatureResolver = resolver; _traversedTokens = null; } - /// - /// Creates a new instance of the structure. - /// - /// The original read context. - /// The object responsible for resolving raw type metadata tokens and addresses. - /// A collection of traversed metadata tokens. - public BlobReadContext(ModuleReaderContext readerContext, ITypeSignatureResolver resolver, IEnumerable traversedTokens) - { - ReaderContext = readerContext; - TypeSignatureResolver = resolver; - _traversedTokens = new Stack(traversedTokens); - } - /// /// Gets the module reader context. /// @@ -64,15 +51,36 @@ public ITypeSignatureResolver TypeSignatureResolver get; } + /// + /// Records a step in the blob reading process where a metadata token into the tables stream is about to + /// be traversed. + /// + /// The token to traverse + /// + /// true if this token was recorded, false if the token was already traversed before. + /// public bool StepInToken(MetadataToken token) { - _traversedTokens ??= new Stack(); - - if (_traversedTokens.Contains(token)) + if (_traversedTokens is null) + _traversedTokens = new Stack(); + else if (_traversedTokens.Contains(token)) return false; _traversedTokens.Push(token); return true; } + + /// + /// Records a step in the blob reading process where the last recorded metadata token into the tables stream + /// was traversed and processed completely. + /// + /// Occurs when there was no token traversed. + public void StepOutToken() + { + if (_traversedTokens is null) + throw new InvalidOperationException(); + + _traversedTokens.Pop(); + } } } diff --git a/src/AsmResolver.DotNet/Signatures/CallingConventionSignature.cs b/src/AsmResolver.DotNet/Signatures/CallingConventionSignature.cs index 563ab5194..e58903d30 100644 --- a/src/AsmResolver.DotNet/Signatures/CallingConventionSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/CallingConventionSignature.cs @@ -20,7 +20,7 @@ public abstract class CallingConventionSignature : ExtendableBlobSignature, IImp /// put into the property. /// The read signature. public static CallingConventionSignature? FromReader( - ref BlobReadContext context, + ref BlobReaderContext context, ref BinaryStreamReader reader, bool readToEnd = true) { @@ -35,7 +35,7 @@ public abstract class CallingConventionSignature : ExtendableBlobSignature, IImp return signature; } - private static CallingConventionSignature? ReadSignature(ref BlobReadContext context, ref BinaryStreamReader reader) + private static CallingConventionSignature? ReadSignature(ref BlobReaderContext context, ref BinaryStreamReader reader) { byte flag = reader.ReadByte(); reader.Offset--; diff --git a/src/AsmResolver.DotNet/Signatures/CustomAttributeArgument.cs b/src/AsmResolver.DotNet/Signatures/CustomAttributeArgument.cs index 58823dd1b..8683f8925 100644 --- a/src/AsmResolver.DotNet/Signatures/CustomAttributeArgument.cs +++ b/src/AsmResolver.DotNet/Signatures/CustomAttributeArgument.cs @@ -19,7 +19,7 @@ public class CustomAttributeArgument /// The type of the argument to read. /// The input stream. /// The argument. - public static CustomAttributeArgument FromReader(in BlobReadContext context, TypeSignature argumentType, + public static CustomAttributeArgument FromReader(in BlobReaderContext context, TypeSignature argumentType, ref BinaryStreamReader reader) { var elementReader = CustomAttributeArgumentReader.Create(); diff --git a/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentReader.cs b/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentReader.cs index 246f8a27f..4ace31c1d 100644 --- a/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentReader.cs +++ b/src/AsmResolver.DotNet/Signatures/CustomAttributeArgumentReader.cs @@ -30,7 +30,7 @@ public bool IsNullArray private set; } - public void ReadValue(in BlobReadContext context, ref BinaryStreamReader reader, TypeSignature valueType) + public void ReadValue(in BlobReaderContext context, ref BinaryStreamReader reader, TypeSignature valueType) { var module = context.ReaderContext.ParentModule; diff --git a/src/AsmResolver.DotNet/Signatures/CustomAttributeNamedArgument.cs b/src/AsmResolver.DotNet/Signatures/CustomAttributeNamedArgument.cs index 770af083e..6d4e08f62 100644 --- a/src/AsmResolver.DotNet/Signatures/CustomAttributeNamedArgument.cs +++ b/src/AsmResolver.DotNet/Signatures/CustomAttributeNamedArgument.cs @@ -69,7 +69,7 @@ public CustomAttributeArgument Argument /// The blob reader context. /// The input stream. /// The argument. - public static CustomAttributeNamedArgument FromReader(in BlobReadContext context, ref BinaryStreamReader reader) + public static CustomAttributeNamedArgument FromReader(in BlobReaderContext context, ref BinaryStreamReader reader) { var memberType = (CustomAttributeArgumentMemberType) reader.ReadByte(); var argumentType = TypeSignature.ReadFieldOrPropType(context, ref reader); diff --git a/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs b/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs index 8e645704a..1a399f616 100644 --- a/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/CustomAttributeSignature.cs @@ -86,7 +86,7 @@ public IList NamedArguments /// The signature. /// Occurs when the input stream does not point to a valid signature. public static CustomAttributeSignature FromReader( - in BlobReadContext context, + in BlobReaderContext context, ICustomAttributeType ctor, in BinaryStreamReader reader) { diff --git a/src/AsmResolver.DotNet/Signatures/FieldSignature.cs b/src/AsmResolver.DotNet/Signatures/FieldSignature.cs index 581d58553..971839ab8 100644 --- a/src/AsmResolver.DotNet/Signatures/FieldSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/FieldSignature.cs @@ -37,7 +37,7 @@ public static FieldSignature CreateInstance(TypeSignature fieldType) /// The blob reader context. /// The blob input stream. /// The field signature. - public static FieldSignature FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + public static FieldSignature FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { return new( (CallingConventionAttributes) reader.ReadByte(), diff --git a/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs b/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs index 23f9ec947..9e12333c8 100644 --- a/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/GenericInstanceMethodSignature.cs @@ -11,7 +11,7 @@ namespace AsmResolver.DotNet.Signatures public class GenericInstanceMethodSignature : CallingConventionSignature, IGenericArgumentsProvider { internal static GenericInstanceMethodSignature? FromReader( - ref BlobReadContext context, + ref BlobReaderContext context, ref BinaryStreamReader reader) { if (!reader.CanRead(sizeof(byte))) diff --git a/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs b/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs index fe4044d0f..5f0e56597 100644 --- a/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/LocalVariablesSignature.cs @@ -16,7 +16,7 @@ public class LocalVariablesSignature : CallingConventionSignature /// The blob reader context. /// The input stream. /// The signature. - public static LocalVariablesSignature FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + public static LocalVariablesSignature FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { var result = new LocalVariablesSignature(); result.Attributes = (CallingConventionAttributes) reader.ReadByte(); diff --git a/src/AsmResolver.DotNet/Signatures/MethodSignature.cs b/src/AsmResolver.DotNet/Signatures/MethodSignature.cs index 2ec85f515..0651a80fb 100644 --- a/src/AsmResolver.DotNet/Signatures/MethodSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/MethodSignature.cs @@ -18,7 +18,7 @@ public class MethodSignature : MethodSignatureBase /// The blob reader context. /// The blob input stream. /// The method signature. - public static MethodSignature FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + public static MethodSignature FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { var result = new MethodSignature( (CallingConventionAttributes) reader.ReadByte(), diff --git a/src/AsmResolver.DotNet/Signatures/MethodSignatureBase.cs b/src/AsmResolver.DotNet/Signatures/MethodSignatureBase.cs index f3ec25f94..4da04a96b 100644 --- a/src/AsmResolver.DotNet/Signatures/MethodSignatureBase.cs +++ b/src/AsmResolver.DotNet/Signatures/MethodSignatureBase.cs @@ -106,7 +106,7 @@ public override bool IsImportedInModule(ModuleDefinition module) /// /// The blob reader context. /// The input stream. - protected void ReadParametersAndReturnType(ref BlobReadContext context, ref BinaryStreamReader reader) + protected void ReadParametersAndReturnType(ref BlobReaderContext context, ref BinaryStreamReader reader) { // Parameter count. if (!reader.TryReadCompressedUInt32(out uint parameterCount)) diff --git a/src/AsmResolver.DotNet/Signatures/PropertySignature.cs b/src/AsmResolver.DotNet/Signatures/PropertySignature.cs index ebbf719fd..7da4f39c3 100644 --- a/src/AsmResolver.DotNet/Signatures/PropertySignature.cs +++ b/src/AsmResolver.DotNet/Signatures/PropertySignature.cs @@ -17,7 +17,7 @@ public class PropertySignature : MethodSignatureBase /// The blob reader context. /// The blob input stream. /// The property signature. - public static PropertySignature? FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + public static PropertySignature? FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { var attributes = (CallingConventionAttributes) reader.ReadByte(); if ((attributes & CallingConventionAttributes.Property) == 0) diff --git a/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs b/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs index 347365357..9ccbcfb75 100644 --- a/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Security/PermissionSetSignature.cs @@ -14,7 +14,7 @@ public class PermissionSetSignature : ExtendableBlobSignature /// The blob reader context. /// The input blob stream. /// The permission set. - public static PermissionSetSignature FromReader(in BlobReadContext context, ref BinaryStreamReader reader) + public static PermissionSetSignature FromReader(in BlobReaderContext context, ref BinaryStreamReader reader) { var result = new PermissionSetSignature(); if (reader.ReadByte() != '.') diff --git a/src/AsmResolver.DotNet/Signatures/Security/SecurityAttribute.cs b/src/AsmResolver.DotNet/Signatures/Security/SecurityAttribute.cs index 92ea1cef5..abb55b287 100644 --- a/src/AsmResolver.DotNet/Signatures/Security/SecurityAttribute.cs +++ b/src/AsmResolver.DotNet/Signatures/Security/SecurityAttribute.cs @@ -17,7 +17,7 @@ public class SecurityAttribute /// The blob reader context. /// The input blob stream. /// The security attribute. - public static SecurityAttribute FromReader(in BlobReadContext context, ref BinaryStreamReader reader) + public static SecurityAttribute FromReader(in BlobReaderContext context, ref BinaryStreamReader reader) { string? typeName = reader.ReadSerString(); var type = string.IsNullOrEmpty(typeName) diff --git a/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs b/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs index 3a841170a..a7e6e6028 100644 --- a/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/SerializedCustomAttributeSignature.cs @@ -10,7 +10,7 @@ namespace AsmResolver.DotNet.Signatures /// public class SerializedCustomAttributeSignature : CustomAttributeSignature { - private readonly BlobReadContext _context; + private readonly BlobReaderContext _context; private readonly TypeSignature[] _fixedArgTypes; private readonly BinaryStreamReader _reader; @@ -21,7 +21,7 @@ public class SerializedCustomAttributeSignature : CustomAttributeSignature /// The types of all fixed arguments. /// The input blob reader. public SerializedCustomAttributeSignature( - in BlobReadContext context, + in BlobReaderContext context, IEnumerable fixedArgTypes, in BinaryStreamReader reader) { diff --git a/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs index 3edc3e299..682ec1f4e 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/ArrayTypeSignature.cs @@ -69,7 +69,7 @@ public IList Dimensions get; } - internal new static ArrayTypeSignature FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + internal new static ArrayTypeSignature FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { var signature = new ArrayTypeSignature(TypeSignature.FromReader(ref context, ref reader)); diff --git a/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs index 1db5d1093..67045f1da 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/GenericInstanceTypeSignature.cs @@ -14,7 +14,7 @@ public class GenericInstanceTypeSignature : TypeSignature, IGenericArgumentsProv private ITypeDefOrRef _genericType; private bool _isValueType; - internal new static GenericInstanceTypeSignature FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + internal new static GenericInstanceTypeSignature FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { var genericType = TypeSignature.FromReader(ref context, ref reader); var signature = new GenericInstanceTypeSignature(genericType.ToTypeDefOrRef(), genericType.ElementType == ElementType.ValueType); diff --git a/src/AsmResolver.DotNet/Signatures/Types/ITypeSignatureResolver.cs b/src/AsmResolver.DotNet/Signatures/Types/ITypeSignatureResolver.cs index 4630add6d..5e67b8f34 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/ITypeSignatureResolver.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/ITypeSignatureResolver.cs @@ -13,7 +13,7 @@ public interface ITypeSignatureResolver /// The blob reading context the type is situated in. /// The token to resolve. /// The type. - ITypeDefOrRef ResolveToken(ref BlobReadContext context, MetadataToken token); + ITypeDefOrRef ResolveToken(ref BlobReaderContext context, MetadataToken token); /// /// Resolves an address to a runtime method table to a type signature. @@ -21,7 +21,7 @@ public interface ITypeSignatureResolver /// The blob reading context the type is situated in. /// The address to resolve. /// The type. - TypeSignature ResolveRuntimeType(ref BlobReadContext context, nint address); + TypeSignature ResolveRuntimeType(ref BlobReaderContext context, nint address); } } diff --git a/src/AsmResolver.DotNet/Signatures/Types/PhysicalTypeSignatureResolver.cs b/src/AsmResolver.DotNet/Signatures/Types/PhysicalTypeSignatureResolver.cs index f819b3fb1..a934931e8 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/PhysicalTypeSignatureResolver.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/PhysicalTypeSignatureResolver.cs @@ -18,7 +18,7 @@ public static PhysicalTypeSignatureResolver Instance } = new(); /// - public virtual ITypeDefOrRef ResolveToken(ref BlobReadContext context, MetadataToken token) + public virtual ITypeDefOrRef ResolveToken(ref BlobReaderContext context, MetadataToken token) { switch (token.Table) { @@ -34,6 +34,9 @@ public virtual ITypeDefOrRef ResolveToken(ref BlobReadContext context, MetadataT if (context.ReaderContext.ParentModule.TryLookupMember(token, out var member) && member is ITypeDefOrRef typeDefOrRef) { + if (token.Table == TableIndex.TypeSpec) + context.StepOutToken(); + return typeDefOrRef; } @@ -47,7 +50,7 @@ public virtual ITypeDefOrRef ResolveToken(ref BlobReadContext context, MetadataT } /// - public virtual TypeSignature ResolveRuntimeType(ref BlobReadContext context, nint address) + public virtual TypeSignature ResolveRuntimeType(ref BlobReaderContext context, nint address) { throw new NotSupportedException( "Encountered an COR_ELEMENT_TYPE_INTERNAL type signature which is not supported by this " diff --git a/src/AsmResolver.DotNet/Signatures/Types/TypeSignature.cs b/src/AsmResolver.DotNet/Signatures/Types/TypeSignature.cs index e975197cd..161c5978c 100644 --- a/src/AsmResolver.DotNet/Signatures/Types/TypeSignature.cs +++ b/src/AsmResolver.DotNet/Signatures/Types/TypeSignature.cs @@ -63,7 +63,7 @@ public abstract ElementType ElementType /// The type signature. /// Occurs when the blob reader points to an element type that is /// invalid or unsupported. - public static TypeSignature FromReader(ref BlobReadContext context, ref BinaryStreamReader reader) + public static TypeSignature FromReader(ref BlobReaderContext context, ref BinaryStreamReader reader) { var elementType = (ElementType) reader.ReadByte(); switch (elementType) @@ -163,7 +163,7 @@ public static TypeSignature FromReader(ref BlobReadContext context, ref BinarySt /// Indicates the coded index to the type is allowed to be decoded to a member in /// the type specification table. /// The decoded and resolved type definition or reference. - protected static ITypeDefOrRef ReadTypeDefOrRef(ref BlobReadContext context, ref BinaryStreamReader reader, bool allowTypeSpec) + protected static ITypeDefOrRef ReadTypeDefOrRef(ref BlobReaderContext context, ref BinaryStreamReader reader, bool allowTypeSpec) { if (!reader.TryReadCompressedUInt32(out uint codedIndex)) return InvalidTypeDefOrRef.Get(InvalidTypeSignatureError.BlobTooShort); @@ -206,7 +206,7 @@ protected void WriteTypeDefOrRef(BlobSerializationContext context, ITypeDefOrRef context.Writer.WriteCompressedUInt32(index); } - internal static TypeSignature ReadFieldOrPropType(in BlobReadContext context, ref BinaryStreamReader reader) + internal static TypeSignature ReadFieldOrPropType(in BlobReaderContext context, ref BinaryStreamReader reader) { var module = context.ReaderContext.ParentModule;