Skip to content

Commit

Permalink
Fix compiling methods with explicit this (#103045)
Browse files Browse the repository at this point in the history
One of the pri1 JIT tests hits asserts because we forget to set the bit.
  • Loading branch information
MichalStrehovsky committed Jun 5, 2024
1 parent cae9e30 commit 2a80808
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -883,6 +883,7 @@ private void Get_CORINFO_SIG_INFO(MethodSignature signature, CORINFO_SIG_INFO* s
ThrowHelper.ThrowBadImageFormatException();

if (!signature.IsStatic) sig->callConv |= CorInfoCallConv.CORINFO_CALLCONV_HASTHIS;
if (signature.IsExplicitThis) sig->callConv |= CorInfoCallConv.CORINFO_CALLCONV_EXPLICITTHIS;

TypeDesc returnType = signature.ReturnType;

Expand Down
9 changes: 9 additions & 0 deletions src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public enum MethodSignatureFlags
UnmanagedCallingConvention = 0x0009,

Static = 0x0010,
ExplicitThis = 0x0020,
}

public enum EmbeddedSignatureDataKind
Expand Down Expand Up @@ -129,6 +130,14 @@ public bool IsStatic
}
}

public bool IsExplicitThis
{
get
{
return (_flags & MethodSignatureFlags.ExplicitThis) != 0;
}
}

public int GenericParameterCount
{
get
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,9 @@ private MethodSignature ParseMethodSignatureImpl(bool skipEmbeddedSignatureData)
if (!header.IsInstance)
flags |= MethodSignatureFlags.Static;

if (header.HasExplicitThis)
flags |= MethodSignatureFlags.ExplicitThis;

int arity = header.IsGeneric ? _reader.ReadCompressedInteger() : 0;

int count = _reader.ReadCompressedInteger();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -658,9 +658,9 @@ public void Pop()
private void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature sig, EmbeddedSignatureDataEmitter signatureDataEmitter)
{
signatureDataEmitter.Push();
BlobEncoder signatureEncoder = new BlobEncoder(signatureBuilder);
int genericParameterCount = sig.GenericParameterCount;
bool isInstanceMethod = !sig.IsStatic;
bool isExplicitThis = sig.IsExplicitThis;
SignatureCallingConvention sigCallingConvention = SignatureCallingConvention.Default;
switch (sig.Flags & MethodSignatureFlags.UnmanagedCallingConventionMask)
{
Expand All @@ -685,7 +685,15 @@ private void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature
if (sigCallingConvention != SignatureCallingConvention.Default)
signatureDataEmitter.UpdateSignatureCallingConventionAtCurrentIndexStack(ref sigCallingConvention);

signatureEncoder.MethodSignature(sigCallingConvention, genericParameterCount, isInstanceMethod);
SignatureAttributes attributes =
(genericParameterCount != 0 ? SignatureAttributes.Generic : 0) |
(isInstanceMethod ? SignatureAttributes.Instance : 0) |
(isExplicitThis ? SignatureAttributes.ExplicitThis : 0);

signatureBuilder.WriteByte(new SignatureHeader(SignatureKind.Method, sigCallingConvention, attributes).RawValue);
if (genericParameterCount != 0)
signatureBuilder.WriteCompressedInteger(genericParameterCount);

signatureBuilder.WriteCompressedInteger(sig.Length);
EncodeType(signatureBuilder, sig.ReturnType, signatureDataEmitter);
for (int i = 0; i < sig.Length; i++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ private static SignatureCallingConvention GetSignatureCallingConvention(Cts.Meth
{
callingConvention |= SignatureCallingConvention.HasThis;
}
if ((signature.Flags & Cts.MethodSignatureFlags.ExplicitThis) != 0)
{
callingConvention |= SignatureCallingConvention.ExplicitThis;
}
return callingConvention;
}

Expand Down

0 comments on commit 2a80808

Please sign in to comment.