Skip to content

Commit

Permalink
Support ref fields in `System.Reflection.Metadata.Ecma335.BlobEncoder…
Browse files Browse the repository at this point in the history
…`. (dotnet#69378)

* Support ref fields in `System.Reflection.Metadata.Ecma335.BlobEncoder`.
Fixes dotnet#68309.
A test case was added.
  • Loading branch information
teo-tsirpanis committed May 17, 2022
1 parent 18410da commit eead8e3
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2499,6 +2499,7 @@ public readonly partial struct BlobEncoder
public System.Reflection.Metadata.BlobBuilder Builder { get { throw null; } }
public void CustomAttributeSignature(System.Action<System.Reflection.Metadata.Ecma335.FixedArgumentsEncoder> fixedArguments, System.Action<System.Reflection.Metadata.Ecma335.CustomAttributeNamedArgumentsEncoder> namedArguments) { }
public void CustomAttributeSignature(out System.Reflection.Metadata.Ecma335.FixedArgumentsEncoder fixedArguments, out System.Reflection.Metadata.Ecma335.CustomAttributeNamedArgumentsEncoder namedArguments) { throw null; }
public System.Reflection.Metadata.Ecma335.FieldTypeEncoder Field() { throw null; }
public System.Reflection.Metadata.Ecma335.SignatureTypeEncoder FieldSignature() { throw null; }
public System.Reflection.Metadata.Ecma335.LocalVariablesEncoder LocalVariableSignature(int variableCount) { throw null; }
public System.Reflection.Metadata.Ecma335.MethodSignatureEncoder MethodSignature(System.Reflection.Metadata.SignatureCallingConvention convention = System.Reflection.Metadata.SignatureCallingConvention.Default, int genericParameterCount = 0, bool isInstanceMethod = false) { throw null; }
Expand Down Expand Up @@ -2620,6 +2621,16 @@ public static partial class ExportedTypeExtensions
{
public static int GetTypeDefinitionId(this System.Reflection.Metadata.ExportedType exportedType) { throw null; }
}
public readonly partial struct FieldTypeEncoder
{
private readonly object _dummy;
private readonly int _dummyPrimitive;
public FieldTypeEncoder(System.Reflection.Metadata.BlobBuilder builder) { throw null; }
public System.Reflection.Metadata.BlobBuilder Builder { get { throw null; } }
public System.Reflection.Metadata.Ecma335.CustomModifiersEncoder CustomModifiers() { throw null; }
public System.Reflection.Metadata.Ecma335.SignatureTypeEncoder Type(bool isByRef = false) { throw null; }
public void TypedReference() { throw null; }
}
public readonly partial struct FixedArgumentsEncoder
{
private readonly object _dummy;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,26 @@ public BlobEncoder(BlobBuilder builder)
Builder = builder;
}

/// <summary>
/// Encodes Field Signature blob, with additional support for
/// encoding ref fields, custom modifiers and typed references.
/// </summary>
/// <returns>Encoder of the field type.</returns>
public FieldTypeEncoder Field()
{
Builder.WriteByte((byte)SignatureKind.Field);
return new FieldTypeEncoder(Builder);
}

/// <summary>
/// Encodes Field Signature blob.
/// </summary>
/// <returns>Encoder of the field type.</returns>
/// <remarks>To encode byref fields, custom modifiers or typed
/// references use <see cref="Field"/> instead.</remarks>
public SignatureTypeEncoder FieldSignature()
{
Builder.WriteByte((byte)SignatureKind.Field);
return new SignatureTypeEncoder(Builder);
return Field().Type(isByRef: false);
}

/// <summary>
Expand Down Expand Up @@ -403,6 +415,36 @@ public SignatureTypeEncoder AddArgument()
}
}

public readonly struct FieldTypeEncoder
{
public BlobBuilder Builder { get; }

public FieldTypeEncoder(BlobBuilder builder)
{
Builder = builder;
}

public CustomModifiersEncoder CustomModifiers()
{
return new CustomModifiersEncoder(Builder);
}

public SignatureTypeEncoder Type(bool isByRef = false)
{
if (isByRef)
{
Builder.WriteByte((byte)SignatureTypeCode.ByReference);
}

return new SignatureTypeEncoder(Builder);
}

public void TypedReference()
{
Builder.WriteByte((byte)SignatureTypeCode.TypedReference);
}
}

public readonly struct FixedArgumentsEncoder
{
public BlobBuilder Builder { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,29 @@ public void BlobEncoder_FieldSignature()
Assert.Same(b, s.Builder);
}

[Fact]
public void BlobEncoder_Field()
{
var b = new BlobBuilder();
var e = new BlobEncoder(b);
Assert.Same(b, e.Builder);

var f = e.Field();
f.CustomModifiers()
.AddModifier(MetadataTokens.TypeDefinitionHandle(1), isOptional: true)
.AddModifier(MetadataTokens.TypeDefinitionHandle(2), isOptional: false);
f.Type(isByRef: true).Object();
AssertEx.Equal(new byte[] { 0x06, 0x20, 0x04, 0x1F, 0x08, 0x10, 0x1C }, b.ToArray());

b.Clear();
f = e.Field();
f.CustomModifiers()
.AddModifier(MetadataTokens.TypeDefinitionHandle(1), isOptional: true)
.AddModifier(MetadataTokens.TypeDefinitionHandle(2), isOptional: false);
f.Type().Int32();
AssertEx.Equal(new byte[] { 0x06, 0x20, 0x04, 0x1F, 0x08, 0x08 }, b.ToArray());
}

[Fact]
public void BlobEncoder_MethodSpecificationSignature()
{
Expand Down

0 comments on commit eead8e3

Please sign in to comment.